在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
进行每次分配都会让你在真正需要它时不太可能错过它。