用memset()初始化非字符内存

函数原型: void memset(void *s, int ch, size_t n);

函数描述:将s中当前位置后面的n个字节用ch替换,并返回s。

注意:由于memset是按字节对内存进行初始化的(按字节的意思就是,要替换n个字节,就要用ch去替换n次,也就是ch只取一个字节(8位二进制位), 对s的后n个字节,逐个替换)。正因为这样的工作方式,导致ch的取值范围为:0~255。所以对int型的数组初始化0和-1以外的数时,就不能达到我们的目的。

这里具体讲一讲,我们应该清楚数据在计算机中以补码的方式存储,
0的补码:00000000 00000000 00000000 00000000
-1的补码:11111111 11111111 11111111 11111111

对int型数组用memset()来初始化为0, -1能得到正确的答案的原因是:
因为ch真正起作用的值,只能是我们给出的ch的值的后八位,以-1为例,此时ch的有效值就是11111111,那么memset会用11111111,去初始化s后面的n个字节,就导致其实作为int型的s[i]的四个字节就都是111111111,这样刚好与32位表示-1的补码一致,所以初始化成功。

当对int型用memset()初始化每个元素为3,会发生什么呢?
3的补码:00000000 00000000 00000000 00000110

所以此时,ch的有效值为00000110,
故而s数组的s[i]被初始化为:00000110 00000110 00000110 00000110,显然这是错误的行为。

你可能感兴趣的:(C语言学习)