我看到人们经常编写C代码,例如:
char *ptr = malloc(sizeof(char)*256);
真的有必要吗?根据定义,标准说sizeof(char)==1
,所以写下来是不合理的:
char *ptr = malloc(256);
答案 0 :(得分:22)
是的,C将sizeof(char)
定义为1,始终(并且C ++也是如此)。
尽管如此,作为一般规则,我建议如下:
char *ptr = malloc(256 * sizeof(*ptr));
这样,当你的老板说出类似的话:“哦,顺便说一句,我们刚收到中国的订单,所以我们需要尽快处理所有三个中文字母”,你可以改为:
wchar_t *ptr // ...
其余的可以保持不变。鉴于你将有大约1000万头痛试图在合理地处理i18n,甚至消除一些是值得的。当然,这假设通常的情况是你的char
真的意图保存字符 - 如果它只是某种原始缓冲区,你真的想要256字节的存储空间,无论有多少(很少)可能的角色,你应该坚持使用malloc(256)
并完成它。
答案 1 :(得分:6)
这个问题甚至不应该存在。你应该采用一种更优雅的习惯来写malloc
作为
ptr = malloc(N * sizeof *ptr)
即。尽量避免提及类型名称。类型名称用于声明,而不用于语句。
这样,您的malloc
将始终与类型无关,并且看起来一致。乘以1是多余的这一事实将不那么明显(因为有些人发现乘以sizeof(char)
令人讨厌)。
答案 2 :(得分:4)
它们是等价的,但保持一致是件好事。它也使它更明确,所以你的意思很明显。如果类型发生变化,则更容易找出需要更新的代码。
答案 3 :(得分:4)
这可能是真的,但只有char
的特定情况才会出现。
我个人认为使用malloc(sizeof(char) * 256)
表单是一种很好的形式,因为有人更改类型,或者为不同类型的类似目的复制代码可能会错过这种情况的细微之处。
答案 4 :(得分:2)
虽然编写sizeof(char)
在技术上没有任何问题,但这样做表明作者不熟悉C以及sizeof(char)
定义为1的事实。在我参与的一些项目中,实际上,我们会查看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以匹配字符串时,这尤其重要
答案 5 :(得分:1)
是的,它们在技术上是等同的。这只是一种风格问题 - 在每次分配时使用sizeof
会让你在真正需要的时候不太可能错过它。