我经常看到malloc分配的语法:
int **p = malloc(N*sizeof(int*))
p
是指针。我也看到了以下语法(也许我的来源不对):
int **p = malloc(N*sizeof(*int))
上述2种语法之间的区别在于,“star”*
出现在第一个类型int
之后,第二个类型之前。
你能告诉我上面两者之间的正确语法吗?
答案 0 :(得分:4)
第二个只能与表达式一起用作sizeof
运算符的操作数(并且*int
不是表达式,这是语法错误)。
您可能已经在代码中看到它使用规范方式来分配任意类型的N个成员的动态数组:
p = malloc (N * sizeof *p);
我故意不显示指针类型p
的声明,因为它不需要。即使p
的类型发生更改,您也无需触及此分配行。它总能做正确的事。
C语法sizeof
quirk:使用表达式操作数,括号是可选的。当操作数是类型时,它们是必需的。
答案 1 :(得分:1)
以上都不适合足够的内存量。以下是正确的:
int *p = malloc(N * sizeof(int));
或
int **p = malloc(N * sizeof(int *));
在第一个中,为整数分配内存,然后将其作为指针返回。第二个是分配指针数组,因此在sizeof关键字中需要*
个字符。
但是对于未来大小的混乱,如果你改变int *p
让我们说char *p
,最好使用这种语法:
int *p = malloc(N * sizeof(*p));
答案 2 :(得分:0)
TL; DR 第一个,部分(考虑到您的实际代码中有终止;
)。
可能是一个更好的正确的写作方式
int *p = malloc(N*sizeof(*p)); // need memory for "int" type, not pointer to int
删除了对数据类型的硬编码依赖。
FWIW,第二个,
int *p = malloc(N*sizeof(*int))
是一个错误的陈述,语法错误。
而且,对于 nitpick ,它不是“star”,它被称为解除引用运算符。