为什么使用 '' 而不是 0 作为内存集?

Why use '' instead of 0 for memset?

本文关键字:内存 为什么      更新时间:2023-10-16

根据此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), '', (len)), (void) 0)


但是void *memset(void *s, int c, size_t n);的第二个参数是int,所以为什么他们推荐''而不是0?memset()文档说:"memset()函数应该将c (转换为unsigned char)参数复制到s指向的对象的前n字节中。"这是更有效还是更明确?这里是否涉及到最佳实践?

第二个参数是整型,所以为什么他们推荐''而不是0?

为了说清楚,这个东西将以一个NUL字符结束;毕竟,memset会将其转化为unsigned char。这只是一个风格问题,因为''具有类型int,因此与0相同。

效率更高吗?

在某种程度上:bzero实际上从来不是标准的一部分。这就是为什么你链接到的页面推荐使用memset。因此,使用memset更有效,因为您可以放心,您的代码在上编译所有标准C编译器。

''代替0
标准要求char可以安全地转换为int类型:

基本源字符集和基本执行字符集都应具有以下内容成员:
[…]
10位十进制数字
0 1 2 3 4 5 6 7 8 9
[…]
在源字符集和执行基本字符集中,在上述十进制数字列表中,0之后的每个字符的值必须大于1前一个的值

因此将''传递给int参数不是问题。更重要的是:你正在传递一个零转义序列,这实际上与传递0相同。
然而,它更显式:memset将初始化N字节为您传递给它的任何值。C语言中唯一保证为1且只有1字节大的类型是char类型。

:

memset(some_ptr, 0, 12);
//is, in practice identical to:
memset(some_ptr, '', 12);

但是看到你设置了12个字节,传递一个1字节大的类型的值更好地反映了这一点。出于这个原因,我更喜欢显式地传递一个char,但这取决于你。

memset历史:
memset函数已经存在很长时间了。事实上,它早在函数原型的时代就存在了!

另一件要记住的事情是,C中的字符字面量本身就像大多数文字值一样,是整型。