二維陣列動態申請分析

2021-10-24 15:30:08 字數 3061 閱讀 1929

#include

intmain

(void),

,,};

printf

("開始: ");

printf

("申請儲存行指標的空間: ");

arr =

(int**

)malloc(4

*sizeof

(int*)

);for(i =

0; i <

4; i++

)printf

("按照二維陣列方式訪問動態申請的arr: ");

for(i =

0; i <

4; i++)}

printf

("直接定義二維陣列arry的訪問方法: ");

for(i =

0; i <

4; i++

)printf

("按照二維陣列方式訪問動態申請的arr: ");

for(i =

0; i <

4; i++

)printf

("arr[i][j]等效訪問方式: ");

for(i =

0; i <

4; i++)}

printf

("此處顯示了arr,*arr和**arr的值: ");

for(i =

0; i <

4; i++

)printf

("直接定義arry[4][3]儲存在連續12個int型棧記憶體空間中: ");

p = arry;

for(i =

0; i <

12; i++

)printf

("動態申請的arr[4][3]儲存在堆上,不能直接通過指標連續訪問12個int型資料,");

printf

("因為malloc申請堆記憶體實際上是以鍊錶方式來管理的,存在額外的表頭空間: ");

p =*arr;

for(i =

0; i <

12; i++

)printf

("釋放二維資料的每一行資料的記憶體空間: ");

for(i =

0; i <

4; i++

)printf

("釋放行指標的記憶體空間: ");

free

(arr)

;printf

("結束! ");

return0;

}

開始:

申請儲存行指標的空間:

申請二維陣列第0行資料的空間(即arr[0]行的資料):

申請二維陣列第1行資料的空間(即arr[1]行的資料):

申請二維陣列第2行資料的空間(即arr[2]行的資料):

申請二維陣列第3行資料的空間(即arr[3]行的資料):

按照二維陣列方式訪問動態申請的arr:

直接定義二維陣列arry的訪問方法:

0x7ffd8ad5b820 = 1, 0x7ffd8ad5b824 = 2, 0x7ffd8ad5b828 = 3,

0x7ffd8ad5b82c = 4, 0x7ffd8ad5b830 = 5, 0x7ffd8ad5b834 = 6,

0x7ffd8ad5b838 = 7, 0x7ffd8ad5b83c = 8, 0x7ffd8ad5b840 = 9,

0x7ffd8ad5b844 = 10, 0x7ffd8ad5b848 = 11, 0x7ffd8ad5b84c = 12,

按照二維陣列方式訪問動態申請的arr:

0x2406050 = 1, 0x2406054 = 2, 0x2406058 = 3,

0x2406070 = 4, 0x2406074 = 5, 0x2406078 = 6,

0x2406090 = 7, 0x2406094 = 8, 0x2406098 = 9,

0x24060b0 = 10, 0x24060b4 = 11, 0x24060b8 = 12,

arr[i][j]等效訪問方式:

0x2406050 = 1, 0x2406054 = 2, 0x2406058 = 3,

0x2406070 = 4, 0x2406074 = 5, 0x2406078 = 6,

0x2406090 = 7, 0x2406094 = 8, 0x2406098 = 9,

0x24060b0 = 10, 0x24060b4 = 11, 0x24060b8 = 12,

此處顯示了arr,*arr和**arr的值:

0x2406020 = 0x2406050 -> 1,

0x2406028 = 0x2406070 -> 4,

0x2406030 = 0x2406090 -> 7,

0x2406038 = 0x24060b0 -> 10,

直接定義arry[4][3]儲存在連續12個int型棧記憶體空間中:

0x7ffd8ad5b820 = 1, 0x7ffd8ad5b824 = 2, 0x7ffd8ad5b828 = 3,

0x7ffd8ad5b82c = 4, 0x7ffd8ad5b830 = 5, 0x7ffd8ad5b834 = 6,

0x7ffd8ad5b838 = 7, 0x7ffd8ad5b83c = 8, 0x7ffd8ad5b840 = 9,

0x7ffd8ad5b844 = 10, 0x7ffd8ad5b848 = 11, 0x7ffd8ad5b84c = 12,

動態申請的arr[4][3]儲存在堆上,不能直接通過指標連續訪問12個int型資料,

因為malloc申請堆記憶體實際上是以鍊錶方式來管理的,存在額外的表頭空間:

0x2406050 = 1, 0x2406054 = 2, 0x2406058 = 3,

0x240605c = 0, 0x2406060 = 0, 0x2406064 = 0,

0x2406068 = 33, 0x240606c = 0, 0x2406070 = 4,

0x2406074 = 5, 0x2406078 = 6, 0x240607c = 0,

釋放二維資料的每一行資料的記憶體空間:

釋放行指標的記憶體空間:

結束!

C 動態申請二維陣列

剛學習,做下總結。以下是我的理解,如有錯誤歡迎指出。申請 int a 乙個指向指標的指標。int n m cin n m a new int n 申請乙個n個元素的一維陣列 作為行 for int i 0 i 關係如下假設 n 3 m 4 先申請乙個一維陣列,陣列的每個元素都是乙個指標變數 該陣列的...

c c 動態申請一維,二維陣列

指標變數名 new 型別名 下標表示式 下標表示式 不是常量表示式,即它的值不必在編譯時確定,可以在執行時確定。這就是堆的乙個非常顯著的特點,有的時候程式設計師本身都不知道要申請能夠多少記憶體的時候,堆就變的格外有用。1.動態申請一維陣列 int p new int n if p null retu...

C 中動態申請二維陣列

這裡主要介紹c 中動態申請二維陣列的兩種方式,直接給出 很容易明白,簡單的作為乙個筆記。include include 輸入輸出操縱 include using namespace std 法一 new 方式申請 void dynamicarray for i 0 i rows i cout end...