为什么要使用' \ 0'对于memset而不是0?

时间:2014-05-22 14:59:28

标签: c++ c

根据此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 字节。"这更有效还是更明确?这里有最佳实践吗?

2 个答案:

答案 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中的字符文字本身与大多数文字值一样,是如何。