加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

memset之使用陷阱挖掘二维数组组织方式

发布时间:2020-12-14 03:32:31 所属栏目:大数据 来源:网络整理
导读:二维数组的一个问题,第一维可以不定,第二维必须指定,例如 void disp(int a[][2],int r,int c);//告知数组的列数 另外初始化的时候会按照元素顺序初始化,例如 int array1[3][2]={4,2,5,6};//顺序初始化 ? ?int array2[3][2]={{4,2},{5},{6}};//按行初始化

二维数组的一个问题,第一维可以不定,第二维必须指定,例如
void disp(int a[][2],int r,int c);//告知数组的列数
另外初始化的时候会按照元素顺序初始化,例如
int array1[3][2]={4,2,5,6};//顺序初始化
? ?int array2[3][2]={{4,2},{5},{6}};//按行初始化
其他值是野值,这点机制显然不如java,因此每次定义变量都要强迫症的初始化,memset,之前还用低效的循环去弄
另外昨天碰到的memset在和机油伟哥交流之后,完美的解决了


昨天我是这么memset的:

<span style="white-space:pre">		</span>bool **iszero=new bool*[rownum];
		//int l=matrix.at(0).size();
		for(int i=0;i<rownum;i++)
			iszero[i]=new bool[colnum];
		memset(iszero,sizeof(bool)*rownum*colnum);


也即申请二维堆之后,直接对二维指针memset,而忘记了 二维数组是如何组织的。伟哥说,二维数组是指向一维指针数组,然后每个指针有指向了一个正常的一维数组,因此我memset iszero指向的 这么多元素的内存,直接把
这些一维指针清空了,后面访问NULL指针自然挂了,因此要这么弄:


bool **iszero=new bool*[rownum];
		//int l=matrix.at(0).size();
		for(int i=0;i<rownum;i++)
		{
			iszero[i]=new bool[colnum];
			memset(iszero[i],sizeof(bool)*colnum);
		}



只能对一维指针memset,这样不会错,按照预期清0.


如果不用memset,是否默认0呢?错误,C++就是这点不好,基本都是野值,不如Java初始为0。
调用默认构造函数,可以iszero[i]=new bool[colnum](); 这样就可以了,用0初始化,


这种是不通过编译的,他应该是不允许传参

iszero[i]=new bool[colnum](0);


后来发现leetcode都是要上面的初始化的,因为他的struct里面写了自定义构造函数,必须传入参数才能构造


后来发现上面是VS的编译器处理,如果GCC的话,只允许(0),不允许(),难怪leetcode 就是GCC呢,然后即使(0),也是野值,不知道为啥,而且bool print出来都是整数啊。所以还是用memset来初始化吧。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读