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