[英]Any reason to use SecureZeroMemory() instead of memset() or ZeroMemory() when security is not an issue?
[英]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.