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来初始化吧。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |