解决new空间不连续导致无法使用memset函数
在使用数组的时候,我们常用memset函数来讲数组内成员全置0,但当我们对动态创建的二维数组进行操作时,程序出错了,百度了一下
原因有两个
1.memset函数只能对连续的空间进行操作
2.new产生的空间不一定连续
当我们用动态创建二维数组时,通常是用下面的方法
#include <iostream> #include<cstring> using namespace std; int main() { //创建一个n*m的连续空间 int **p; int n,m; cin>>n>>m; p = new int*[n]; //原来的方法 for(int i=0 ;i<n ; i++) { *(p+i) = new int[m]; } memset(*p,0,sizeof(int)*n*m); //输出 for(int i =0;i<n;i++) { for(int j =0 ;j<m ;j++) { cout<<p[i][j]<<' '; } cout<<endl; } return 0; }
运行一下
发现输出出错了,前面还是正常的,后面就不正常了,说明new的空间,时而连续,时而不连续。(注意:n,m很小,偶尔可以正常运行)
下面,我们用一种新的方法来创建二维数组。
#include <iostream> #include<cstring> using namespace std; int main() { //创建一个n*m的连续空间 int **p; int n,m; cin>>n>>m; p = new int*[n]; //新方法,可以使用memset *p = new int[n*m];//先创建以*p为首地址的连续的全部空间 for(int i=0;i<n;i++) { *(p+i) = *p + i*m;//将原本的各行的头与连续空间相应点匹配 } memset(*p,0,sizeof(int)*n*m); //输出 for(int i =0;i<n;i++) { for(int j =0 ;j<m ;j++) { cout<<p[i][j]<<' '; } cout<<endl; } return 0; }
运行一下
可以正常运行。
但是
第一种情况下,我们可以按平时的方式delete这个空间:
for(int i=0;i<n;i++) { delete[](p+i); } delete[]p; return 0;
但是下面的情况下,由于其空间是连续的,且从p[0]开始,所以直接delete p[0]这个连续空间即可
delete[]p[0];