繁体   English   中英

为什么在memset中使用'\\ 0'而不是0?

[英]Why use '\0' instead of 0 for memset?

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

第二个arg是一个int,为什么他们推荐'\\ 0'而不是0?

要说清楚,事情最终会成为一个NUL角色; 毕竟memset会将它转换为unsigned char 这只是样式问题,因为'\\0'类型为int ,因此与0相同。

它效率更高吗?

在某种程度上: 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中的字符文字本身就像大多数字面值一样,是int。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM