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

本文探讨了C++中二维数组的使用与初始化方法,包括如何正确使用memset进行内存清零,以及不同初始化方式的区别。此外,还讨论了C++与Java在数组处理上的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二维数组的一个问题,第一维可以不定,第二维必须指定,例如
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,0,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],0,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来初始化吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值