使用malloc分配char数组

22

考虑以下代码行:

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

为什么要使用 sizeof(char)?这不是必要的,是吗?还是只是一种风格问题?

它有哪些优势?


1
重复的问题,参见https://dev59.com/pnNA5IYBdhLWcg3wUMDn,尽管我不同意那里被接受的答案(我更喜欢省略sizeof(char))。 - user85509
3个回答

28

是的,这是一种风格问题,因为你期望sizeof(char)始终为1。

另一方面,在使用malloc时使用sizeof(foo)非常常见,最重要的是它使代码具有自说明性。

也许更适合维护。如果您想从char切换到wchar,则需要切换到

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 ) );

对于普通缓冲区而言。


那为什么不使用type *p = malloc(sizeof(*type) * (len+1));呢?;) - Nyan
@Nyan:当然,那也可以。虽然我以前从未见过这种写法,但如果我还是一名C程序员的话,我会考虑采用你的建议作为惯用语……不过len +1部分只适用于类似字符串的对象。 - brainjam
4
它不仅应该是1,它的定义也是如此。这是极少数尺寸被明确定义的物品之一。 - JaredPar

2

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


2
规范规定字符是1个字节,所以这是可选的。出于一致性考虑,我个人总是包括sizeof,但并不重要。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接