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

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

char *ptr = malloc(sizeof(char)*256); 

这真的有必要吗? 根据定义,标准说sizeof(char)==1 ,所以写入是不合理的:

 char *ptr = malloc(256); 

谢谢,Boda Cydo。

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

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

 char *ptr = malloc(256 * sizeof(*ptr)); 

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

 wchar_t *ptr // ... 

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

这个问题甚至不应该存在。 你应该采用一种更优雅的习惯来写你的malloc ‘s

 ptr = malloc(N * sizeof *ptr) 

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

这样你的malloc将始终与类型无关并且看起来一致。 乘以1是多余的这一事实将不那么明显(因为有些人发现乘以sizeof(char)令人烦恼)。

它们是等价的,但保持一致是件好事。 它也使它更明确,所以你的意思很明显。 如果类型发生变化,则更容易找出需要更新的代码。

这可能是真的,但只有char特定情况才是这样。

我个人认为使用malloc(sizeof(char) * 256)表单是一种很好的forms,因为有人改变了类型,或者为了类似目的而复制了不同类型的代码,可能会错过这种情况的细微之处。

虽然编写sizeof(char)在技​​术上没有任何问题,但这样做表明作者不熟悉C和sizeof(char)定义为1的事实。在我工作的一些项目中,我们实际上是grep实例sizeof(char)表示代码可能是低质量的。

另一方面, ptr = malloc(count * sizeof(*ptr)); 是一个非常有用的文档和避免错误的习惯用法,即使sizeof(*ptr)为1也是有意义的。但是,它需要以if (count > SIZE_MAX/sizeof(*ptr)) { /* handle overflow */ }或者你有一个严重的错误。 在分配wchar_t数组或与输入字符串长度相同的复杂结构时,例如将UTF-8字符串转换为wchar_t字符串或构建DFA以匹配字符串时,这尤其重要。

是的,它们在技术上是等同的。 这只是一种风格问题 – 使用sizeof进行每次分配都会让你在真正需要它时不太可能错过它。