我承认这三个都有不同的含义。但是,我不明白这些具体情况适用于哪些特定情况。任何人都可以分享每个例子吗?谢谢你。
malloc(sizeof(int))
malloc(sizeof(int *))
(int *)malloc(sizeof(int))
我承认这三个都有不同的含义。但是,我不明白这些具体情况适用于哪些特定情况。任何人都可以分享每个例子吗?谢谢你。
malloc(sizeof(int))
malloc(sizeof(int *))
(int *)malloc(sizeof(int))
malloc(sizeof(int))
意味着您正在从堆中分配空间来存储int
. 您将根据需要保留尽可能多的字节int
。 这将返回一个您应该转换为的值 正如一些人所指出的,C 中的典型做法是让隐式转换来处理这个问题。int *
。(指向 . 的指针int
。)
malloc(sizeof(int*))
意味着您正在从堆中分配空间来存储指向int
. 您保留的字节数与指针所需的一样多。这将返回一个您应该转换为int **
. (指向指向 . 的指针的指针int
。)
(int *)malloc(sizeof(int))
与第一次调用完全相同,但结果显式转换为指向 an 的指针int
。
请注意,在许多体系结构中,anint
与指针的大小相同,因此它们看起来(错误地)都是一样的。换句话说,您可能不小心做错了事,结果代码仍然可以工作。
最简单的语法模式是:
int *p;
p = malloc (cnt * sizeof *p);
如果 *p 的类型(和或大小......)发生变化,此语法不会强制您更改代码,例如
struct mysstruct *q;
q = malloc (cnt * sizeof *q);
这将避免诸如
struct mysstruct *z;
z = malloc (cnt * sizeof(struct hisstruct)); // Auch!
,加:sizeof expr
形式也更短。
更新:为了证明p = malloc(CNT * sizeof *p)
这个测试程序的正确性:
#include <stdio.h>
#include <stdlib.h>
struct mystruct {
int i;
char s[14];
};
int main(void)
{
struct mystruct *p;
size_t siz;
siz = sizeof p;
printf("Sizeof p := %zu\n", siz);
siz = sizeof *p;
printf("Sizeof *p := %zu\n", siz);
printf("Allocating %zu (%u structs, each of size %zu) bytes to be assigned to p...\n"
, 10u * sizeof *p
, 10u, sizeof *p
);
p = malloc(10 * sizeof *p);
return 0;
}
这里输出:
Sizeof p := 8
Sizeof *p := 20
Allocating 200 (10 structs, each of size 20) bytes to be assigned to p...