该手册页说,约memset:
#include <string.h> void *memset(void *s, int c, size_t n) 的memset()功能填充第一n 字节由指向的存储器区域的s具有恒定字节c。
很明显,memset不能使用它来初始化int数组,如下所示:
int a[10]; memset(a, 1, sizeof(a));
这是因为int用4个字节表示(例如),并且无法获得array中整数的期望值a。 但是我经常看到程序员 memset用来将int数组元素设置为0或-1。
int a[10]; int b[10]; memset(a, 0, sizeof(a));
memset(b, -1, sizeof(b));
根据我的理解,用整数初始化0就可以了,因为0可以用1个字节表示(在这种情况下我可能错了)。但是,如何b用-1(4个字节的值)进行初始化呢? 问题来源于stack overflow
奇怪的是,之所以这个作品用-1是完全一样的,这个作品以零的原因:在二进制补码表示,-1拥有1S IN的所有位,无论整数的大小,在一个地区做馅用字节填充all 在二进制补码硬件上1生成带-1符号ints,longs和shorts 的区域。
在不同于二进制补码的硬件上,结果将有所不同。的-1整数常数将被转换成一个unsigned char全部为,因为标准是特定的转换必须如何进行。但是,1根据平台的规则,所有位都设置为的字节区域将被解释为整数值。例如,在符号和大小的硬件上,数组的所有元素将包含对应类型的最小负值。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。