malloc(sizeof(int))vs malloc(sizeof(int *))vs(int *)malloc(sizeof(int))
我承认所有这三个都有不同的含义。 但是,我不明白每种情况适用于哪些特定情况。 任何人都可以分享这些例子吗? 谢谢。
malloc(sizeof(int)) malloc(sizeof(int *)) (int *)malloc(sizeof(int))
malloc(sizeof(int))
表示从堆中分配空间来存储int
。 您需要保留尽可能多的字节数。 这将返回您应该转换为 int *
。(指向正如一些人所指出的,C中的典型做法是让隐式转换处理这个问题。 int
的指针。)
malloc(sizeof(int*))
表示从堆中分配空间以存储指向int
的指针。 您保留指针所需的字节数。 这将返回一个你应该转换为int **
。 (指向int
的指针。)
(int *)malloc(sizeof(int))
与第一次调用完全相同,但结果显式地转换为指向int
的指针。
请注意,在许多体系结构中, int
与指针的大小相同,因此这些似乎(错误地)完全相同。 换句话说,您可能会意外地做错事并使得结果代码仍然有效。
最简单的语法模式是:
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
forms也更短。
更新:certificatep = malloc(CNT * sizeof *p)
这个测试程序的正确性:
#include #include 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...