用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,显然这是错误的行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值