c 函数 memset使用注意事项

#include <cstdio>
#include <cstring>
int main() {
	int a[5];
	memset(a, -1, sizeof a);
	for (int i = 0; i < 5; i++) {
		printf("%d\n", a[i]);
	}
	return 0;
}

如上代码使用memset对一个数组进行初始化,输出的结果如下:

-1
-1
-1
-1
-1

但如果是初始化 代码写为memset(a, 1, sizeof a);,发现如下的结果

16843009
16843009
16843009
16843009
16843009

那么为什么前一个初始化可以呢?

首先看memset函数定义

void *memset(void *str, int c, size_t n);

这里,str是指向要填充的内存块的指针,c是要设置的值(虽然是int类型,但实际上只会使用该值的低8位),n是要设置的字节数。

那么其中关键在于会对要填充的内存块每一个字节8位都存上 c 里面的低8位内容。

当你使用memset对一个int数组使用-1进行填充时,由于-1在内存中以补码形式表示,对于一个32位的系统,-1的二进制表示为11111111 11111111 11111111 11111111。因此,当memset用-1填充时,它实际上将每个字节都设置为11111111,这正好使得每个int元素都变为了-1。

然而,当尝试用1来填充时,情况就不同了。1的二进制表示为00000001(只考虑一个字节)。如果你用1来填充一个int数组,memset会将每个字节都设置为00000001。对于32位的int来说,每个int元素将会是00000001 00000001 00000001 00000001,这并不等于1。对于一个32位系统,这个值实际上是16843009,而不是1。

其他用法还有可以初始化一个int 类型的数组内容全为 INF的0x3f3f3f3f,那么只需要写成这样即可memset(a, 0x3f, sizeof a);

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlwaysDayOne

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值