使用malloc的正确语法:sizeof(* int)或sizeof(int *)

时间:2017-04-05 07:14:32

标签: c syntax malloc

我经常看到malloc分配的语法:

int **p = malloc(N*sizeof(int*))

p是指针。我也看到了以下语法(也许我的来源不对):

int **p = malloc(N*sizeof(*int))

上述2种语法之间的区别在于,“star”*出现在第一个类型int之后,第二个类型之前。

你能告诉我上面两者之间的正确语法吗?

3 个答案:

答案 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”,它被称为解除引用运算符。