當我們定義乙個二維指標時,如果需要儲存相應的資料,就需要我們動態的分配記憶體,這時,有一點是需要注意的,分配記憶體的方法不同,記憶體的連續性也是不相同的,首先,博主先貼出測試**:
#include #include 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<
執行截圖如下:
如圖所示,兩種分配記憶體的方法都能正確的分配記憶體,但是記憶體分配的空間確實不一樣的。
分析:
第一種分配方法:
首先,是對每一行分配,也就是 nwidth 中的每乙個進行分配,所以,我們可以看到每一行的記憶體都是連續的,每乙個都佔據四個位元組
但是,為nheight分配記憶體的時候,是隨機的進行分配記憶體,所以記憶體的位置是不確定的,所以,出現了第一種情況
第二種分配方法:
首先,同樣是為 p 分配記憶體,現在 p 指向乙個位置
但是,在第二句中,我們需要注意,是直接在 p[0] 出分配了所有需要的記憶體,所以,這個時候就全部分配完了,而且由於是一次性分配記憶體,故記憶體的位址肯定是連續的,執行結果也證明了這一點
釋放記憶體的兩種情況:
第一種情況由於是兩次不同的分配記憶體,所以,在釋放記憶體的時候,我們應選擇不同的區域進行釋放。
第二種情況,只是連續呼叫兩次 malloc ,所以,只需要連續兩次呼叫 free 即可完成釋放。
二維指標動態分配記憶體連續問題分析
當我們定義乙個二維指標時,如果需要儲存相應的資料,就需要我們動態的分配記憶體,這時,有一點是需要注意的,分配記憶體的方法不同,記憶體的連續性也是不相同的,首先,博主先貼出測試 include include using namespace std define nwidth 3 define nhe...
二維陣列動態分配記憶體
在robert sedgewick所著的algorithm in c中,把二維陣列當成陣列的陣列為它動態分配記憶體。首先,分配乙個指標的陣列,然後為每一行分配記憶體。函式定義 void malloc2d int r,int c,int size void free2d void arr,int r ...
二維陣列動態分配記憶體
對二維陣列分配動態空間 1.已知二維陣列的行 第一維 include include 已知陣列的行數 列數由終端輸入 int main void int i,j,num int a 3 已知陣列有3行 printf 請輸入二位陣列的列數 n scanf d num 列數由終端輸入 for i 0 i...