2010-06-25 86 views
9

字符数组嗨最近我看到网上很多的代码(也SO;),如:分配使用malloc

char *p = malloc(sizeof(char) * (len + 1)); 

为什么的sizeof(字符)?这不是必要的,不是吗?还是仅仅是一个风格问题? 它有什么优势?

+1

重复http://stackoverflow.com/questions/1011806/is-it-necessary-to-multiply-by-sizeof-char-当 - 操纵记忆虽然我不同意在那里接受的答案(我宁愿省略sizeof(char)) – user85509 2010-06-25 04:40:45

回答

12

是的,这是一个风格问题,因为你期望sizeof(char)永远是一个。

另一方面,在做malloc时,使用sizeof(foo)是一个非常成语,最重要的是它使代码自行记录。

也许更好的维护。如果您是从charwchar切换,你会切换到

wchar *p = malloc(sizeof(wchar) * (len + 1)); 

没有太多的想法。鉴于转换语句char *p = malloc( len + 1 );需要更多思考。这是关于减少精神开销。

而作为@Nyan暗示的评论,你也可以实现零终止字符串做

type *p = malloc(sizeof(*p) * (len + 1)); 

type *p = malloc(sizeof(*p) * len)); 

普通缓冲区。

+0

然后为什么不使用类型* p = malloc(sizeof(* type)*(len + 1)); ;) – Nyan 2010-06-25 04:52:46

+3

哦,我的意思是sizeof(* p) – Nyan 2010-06-25 04:58:18

+0

@Nyan:当然,那也可以。我从来没有见过这个,但如果我仍然是一个工作的C程序员,我会考虑采用你的建议作为一个习惯用法。尽管'len + 1'部分只适用于类似字符串的对象。 – brainjam 2010-06-25 04:59:10

1

它用于自行记录操作。该语言将字符定义为一个字节。它没有指定在该字节中有多少个,因为一些机器具有8,12,16,19或30位最小可寻址单位(或更多)。但是char总是一个字节。

1

该规范规定字符是1个字节,因此它是严格可选的。我个人总是包括sizeof出于一致性的目的,但它并不重要