使用memset初始化int型数组的坑

2021/3/23更新:

#include<algorithm> 的 fill() 函数,可以方便快捷的初始化数组元素为规约范围内的任意值~

 例子:将数组元素全部初始化为233

int a[5]={0};
fill(a,a+5,233);

原博: 

头文件:#include<memory.h>

或者直接上万能头文件:#include<bits/stdc++.h>    (才发现头文件居然还可以开外挂,以后再也不怕不怕啦,牛掰啊 ~)

But,不要高兴的太早哦,

memset初始化int型数组的时候只支持将数组中的所有元素初始化为0-1~

上测试代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
	int e[10][10];
	//数组初始化全部元素为-1 
	cout<<"数组初始化全部元素为-1: "<<endl;
	memset(e,-1,sizeof(e));
	for(int i=0;i<10;i++){
		for(int j=0;j<10;j++)
			cout<<e[i][j]<<" ";
		cout<<endl; 
	}
	//数组初始化全部元素为 0 
	//或者最简单的方式,在定义数组时 ---> int e[10][10]={0};
	cout<<"数组初始化全部元素为0: "<<endl;
	memset(e,0,sizeof(e));
	for(int i=0;i<10;i++){
		for(int j=0;j<10;j++)
			cout<<e[i][j]<<" ";
		cout<<endl; 
	}
	return 0;	
} 

结果:

如果执行memset(e,1,sizeof(e));呢?(千万不要做这样的傻事!!!)

以身试错就是我:

好了,测试部分结束,我们要分析一下,为什么会出现这样的情况,怎么0、-1可以被初始化,1就不行了呢?

百度百科中的memset:
void *memset(void *s, int ch,  size_t  n);
将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作,其返回值为指向S的指针。

memset是依靠二进制进行初始化,int是4个字节,memset把每个字节都赋值,也就是说,比如

因为计算机中用二进制补码表示数字,0和二进制补码为全0,-1的二进制补码为全1!

0,补码是00000000 00000000 00000000 00000000结果是0

-1,补码是11111111 11111111 11111111 11111111结果也是-1

所以对于0、-1可以被初始化,仅仅是个美丽的巧合~

但是 memset() 可以初始化一个 bool数组 memset(b,true或false,sizeof(b));//b是个bool数组

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值