程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++二維指針動態分配內存連續問題

C++二維指針動態分配內存連續問題

編輯:關於C++

當我們定義一個二維指針時,如果需要存儲相應的數據,就需要我們動態的分配內存,這時,有一點是需 要注意的,分配內存的方法不同,內存的連續性也是不相同的,首先,博主先貼出測試代碼:

#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 即可完成釋放。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved