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

头文件:#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数组

猜你喜欢

转载自blog.csdn.net/WKX_5/article/details/114629671