当前位置:首页 >> 编程开发 >> Visual C++ >> 内容

C++二维指针动态分配内存连续问题

时间:2013/11/24 作者:平凡之路 来源:xuhantao.com 浏览:

当我们定义一个二维指针时,如果需要存储相应的数据,就需要我们动态的分配内存,这时,有一点是需 要注意的,分配内存的方法不同,内存的连续性也是不相同的,首先,博主先贴出测试代码:

#include <cstdlib>  
#include <iostream>  
      
using namespace std;  
      
#define nWidth  3  
#define nHeight 4  
      
//内存是否连续分配问题   
int main(int argc, char *argv[])  
{  
    int **p = NULL;  
    p = (int**)malloc(nWidth*sizeof(int*));  
    if(p == NULL)  
    return -1;  
          
    cout<<"内存的不连续分配:"<<endl;  
    for(int j = 0; j< nWidth; j++)  
    {  
       p[j] = (int*)malloc(nHeight*sizeof(int));  
       if(p[j] == NULL)  
       return -1;  
    }  
          
    for(int i = 0; i < nWidth; i++)  
        for(int j = 0; j < nHeight; j++)  
        {  
            printf("%p  ",&p[i][j]);  
            if(j == nHeight-1)  
                cout<<endl;  
        }  
    cout<<endl;  
          
    for(int j = 0; j < nWidth; j++)  
    {  
       free(p[j]);  
       p[j] = NULL;          
    }  
    free(p);  
    p = NULL;  
          
          
    int **q = NULL;  
    q = (int**)malloc(nWidth*sizeof(int*));  
    if(q == NULL)  
    return -1;  
          
    cout<<"内存的连续分配:"<<endl;  
    q[0] = (int*)malloc(nWidth*nHeight*sizeof(int));  
    if(q[0] == NULL)  
    {  
        free(q);  
        return -1;  
    }  
    for(int i = 1;i < nWidth; i++)  
    q[i] = q[i-1] + nHeight;  
          
    for(int i = 0; i < nWidth; i++)  
        for(int j = 0; j < nHeight; j++)  
        {  
            printf("%p  ",&q[i][j]);  
            if(j == nHeight-1)  
                cout<<endl;  
        }  
    cout<<endl;  
          
    free(q[0]);  
    q[0] = NULL;  
    free(q);  
    q = NULL;  
          
    system("PAUSE");  
    return EXIT_SUCCESS;  
}

运行截图如下:

如图所示,两种分配内存的方法都能正确的分配内存,但是内存分配的空间确实不一样的。

分析:

第一种分配方法:

首先,是对每一行分配,也就是 nWidth 中的每一个进行分配,所以,我们 可以看到每一行的内存都是连续的,每一个都占据四个字节

但是,为nHeight分配内存的时候,是随机 的进行分配内存,所以内存的位置是不确定的,所以,出现了第一种情况

第二种分配方法:

首 先,同样是为 p 分配内存,现在 p 指向一个位置

但是,在第二句中,我们需要注意,是直接在 p[0] 出分配了所有需要的内存,所以,这个时候就全部分配完了,而且由于是一次性分配内存,故内存的地址肯定 是连续的,运行结果也证明了这一点

释放内存的两种情况:

第一种情况由于是两次不同的分配 内存,所以,在释放内存的时候,我们应选择不同的区域进行释放。

第二种情况,只是连续调用两次 malloc  ,所以,只需要连续两次调用 free 即可完成释放。

相关文章
  • 没有相关文章
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 徐汉涛(www.xuhantao.com) © 2024 版权所有 All Rights Reserved.
  • 部分内容来自网络,如有侵权请联系站长尽快处理 站长QQ:965898558(广告及站内业务受理) 网站备案号:蒙ICP备15000590号-1