根据此Unix文档http://pubs.opengroup.org/onlinepubs/009695399/functions/bzero.html
The memset() function is preferred over bzero().
For maximum portability, it is recommended to replace
the function call to bzero() as follows:
#define bzero(b,len) (memset((b), '\0', (len)), (void) 0)
但是void *memset(void *s, int c, size_t n);
第二个arg是 int ,那么为什么他们推荐' \ 0'而不是0? memset()doc说" memset()函数应将 c ( 转换为unsigned char )arg复制到每个 s 指向的对象的第一个 n 字节。"这更有效还是更明确?这里有最佳实践吗?
答案 0 :(得分:5)
第二个arg是一个int,所以他们为什么推荐' \ 0'而不是0?
要说清楚事情最终会成为一个NUL角色;毕竟memset
会将其转换为unsigned char
。这只是一种风格问题,因为'\0'
的类型为int
,因此与0
相同。
答案 1 :(得分:3)
效率更高吗?
在某种程度上:bzero
实际上从未成为标准的一部分。这就是您链接到的网页建议使用memset
的原因。因此,使用memset
更有效,因为您可以放心,您的代码将编译在所有标准C编译器上。
'\0'
而不是0
该标准要求char可以安全地转换为int:
基本源和基本执行字符集应具有以下内容 成员:
[...]
10位小数位数
0 1 2 3 4 5 6 7 8 9
[...]
在源和执行基本字符集中, 上述小数位数列表中0后的每个字符的值应大于1 以前的价值。
因此将'\0'
传递给int参数不是问题。更重要的是:你传递了一个零逃逸序列,这实际上与传递0相同。
但是,它更明确:memset
会将N个字节初始化为传递给它的任何值。 C中唯一一个保证为1且只有1个字节大的类型是char
类型。
所以:
memset(some_ptr, 0, 12);
//is, in practice identical to:
memset(some_ptr, '\0', 12);
但是,当您设置12个字节时,传递1字节大型的值会更好地反映这一点。我更喜欢明确地传递一个字符,但这取决于你。
memset
的历史记录:
函数memset
已存在多年。事实上,它存在于函数原型的时代!
要记住的另一件事是C中的字符文字本身与大多数文字值一样,是如何。