用new创建二维数组不可以直接memset
memset可以将数组初始化,不管是一维数组还是二维数组。但是其前提是数组空间必须是连续的。
new一次出的空间是连续的,但是多次new出的空间不一定是连续的,所以不能直接使用memset初始化。
看如下例子:
#include<iostream>
using namespace std;
int main(){
int n=5;
int m=10;
//new申请二维数组
int** a=NULL;
a=new int* [n];
for (int i=0; i<n; i++)
a[i]=new int [m];
memset(*a,0,sizeof(a)); //memset无效,因为内存不连续
for (int i=0; i<n; i++){
for (int j=0; j<m; j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
//delete释放二维数组
for (int i=0; i<n; i++){
delete [] a[i];
a[i]=NULL;
}
delete []a;
a=NULL;
}
由上可知,这种多次new的方法创建的二维数组是不一定连续的,所以无法使用memset。
解决办法:改变new的使用方法
我们可以直接new一整块数组的内存空间,然后再分配给每行的指针,这样数组的空间就是连续的了。
#include<iostream>
using namespace std;
int main(){
int n=5;
int m=10;
//改进的new使用方法
int** a=NULL;
a=new int* [n]; //行首
*a=new int [n*m]; //new整块空间
for (int i=0; i<n; i++){
*(a+i) = *a + i*m; //将原本的各行的头与连续空间相应点匹配
}
memset(*a,0,sizeof(int)*n*m); //可以
for (int i=0; i<n; i++){
for (int j=0; j<m; j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
//delete释放
delete [] a[0]; //由于其空间是连续的,且从p[0]开始,所以直接delete p[0]这个连续空间即可
a=NULL;
}