解决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];

 

posted @ 2018-03-12 19:13  巴特曼  阅读(425)  评论(0编辑  收藏  举报