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