2010-07-01 85 views
11

我看到,人们经常写C代码,如:在C中,malloc(256)和malloc(sizeof(char)* 256)是否相等?

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

是不是真的有必要吗?该标准说sizeof(char)==1定义,因此不很有意义只是写:

char *ptr = malloc(256); 

谢谢,博大Cydo。

+1

参见:http://stackoverflow.com/questions/2215445/are-there-machines-where-sizeofchar-1 – Saul 2010-07-01 22:13:34

+2

还值得注意的是sizeof()运算符是在编译时计算的,所以没有运行时性能打到使用sizeof()。 (除了在运行时指定数组长度的情况,但这不是您使用的示例。) – poundifdef 2010-07-01 22:24:27

+0

为什么不使用calloc? – luiscubal 2010-07-01 22:55:35

回答

21

是的,C定义sizeof(char)为1,总是(和C++一样好)。当你的老板说像

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

这样,:“哦,顺便说一句,我们刚刚从中国的订单,所以我们需要

然而,作为一般规则,我建议像尽快处理所有三个中文字母“,您可以将其更改为:

wchar_t *ptr // ... 

其余可以保持不变。鉴于你将有大约1000万令人头疼的事情,试图在合理的中途处理国际事务,甚至有一些事情是值得的。当然,假设你的char实际上是用来保存字符的 - 通常情况下,如果它只是某种原始缓冲区,并且你确实需要256字节的存储空间,而不管有多少(少数)字符可能是,你应该坚持malloc(256)并完成它。

+0

这很聪明,我没有知道sizeof(* type)按预期工作了 – poundifdef 2010-07-01 22:21:24

+2

@rascher:这里没有'sizeof(* type)''ptr'不是一个类型,它是一个指针变量 – AnT 2010-07-01 22:23:32

+1

@rascher:为了澄清,你可以使用sizeof(type)或sizeof(expression)'在后一种情况下,编译器推导出表达式的类型,但表达式本身是* not *求值的,所以它不需要包含有效值(例如,代码似乎解引用null或uni硝化指针仍然很好)。 – 2010-07-01 22:28:27

4

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

1

是的,它们在技术上是等效的。这只是一个风格问题 - 使用sizeof为每个分配使你不太可能错过它,当你真的需要它。

4

这可能是对的,但只对char这个特定情况才是正确的。

我个人认为这是使用malloc(sizeof(char) * 256)表单的好方法,因为有人更改类型或将代码复制到类型不同的类似用途可能会漏掉这种情况的微妙之处。

+0

+1复制代码时 – Cam 2010-07-01 22:14:56

+0

如果有人更改类型,sizeof(char)* 256'不会帮助你;你是指'sizeof * ptr * 256'? – 2010-07-01 22:16:33

+0

@Charles,同意,他们仍然必须改变声明中的类型,但至少应该是明确的,而不是仅仅是一个数字 – 2010-07-01 22:18:57

6

问题不应该存在。你应该采取写你malloc的更优雅的成语作为

ptr = malloc(N * sizeof *ptr) 

即避免提及类型名称尽可能。类型名称用于声明,不用于声明。

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

2

虽然没有什么技术上的错误与写作sizeof(char),这样做表明,笔者不熟悉C和sizeof(char)被定义为在一些项目我工作的事实,我们实际上用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以匹配字符串时,这可能尤其相关。

+0

值得注意的是,即使在char大于8位的系统上(我已经使用了16位的字符),sizeof(char)仍然是1;在这种情况下sizeof(int)也是一个。我甚至听说过sizeof(long)也是一个的系统,因为char是64位的。 – supercat 2010-08-13 15:46:21