在C中是malloc(256)和malloc(sizeof(char)*256)等价吗?

bod*_*ydo 12 c malloc pointers sizeof

我看到人们经常编写C代码,例如:

char *ptr = malloc(sizeof(char)*256);
Run Code Online (Sandbox Code Playgroud)

这真的有必要吗?标准说,sizeof(char)==1根据定义,只写这样有意义:

char *ptr = malloc(256);
Run Code Online (Sandbox Code Playgroud)

谢谢,Boda Cydo.

Jer*_*fin 25

是的,C定义sizeof(char)为1,始终(并且C++也是如此).

尽管如此,作为一般规则,我建议如下:

char *ptr = malloc(256 * sizeof(*ptr));
Run Code Online (Sandbox Code Playgroud)

这样,当你的老板说出类似的话:"哦,顺便说一句,我们刚收到一份来自中国的订单,所以我们需要尽快处理所有三个中文字母",你可以把它改成:

wchar_t *ptr // ...
Run Code Online (Sandbox Code Playgroud)

其余的可以保持不变.鉴于你将有大约1000万头疼,甚至在合理的中途处理i18n,甚至消除一些是值得的.当然,这假设通常的情况是你的chars真的打算保存字符 - 如果它只是某种原始缓冲区,你真的想要256字节的存储空间,无论可能有多少(少数)字符是的,你应该坚持malloc(256)并完成它.

  • @Jerry Coffin:它实际上是`sizeof(type)`或`sizeof expression`,这意味着除非需要覆盖优先级,否则不需要在`()`中包围表达式. (7认同)
  • @rascher:那里没有`sizeof(*type)`.`ptr`不是一种类型.它是一个指针变量. (3认同)

AnT*_*AnT 6

这个问题甚至不应该存在.你应该采用一种更优雅的写作malloc方式

ptr = malloc(N * sizeof *ptr)
Run Code Online (Sandbox Code Playgroud)

即尽量避免提及类型名称.类型名称用于声明,而不用于语句.

这样你的mallocs将永远是类型独立的,并且看起来是一致的.乘以1是多余的这一事实将不那么明显(因为有些人发现乘法sizeof(char)很烦人).