贊助廠商

娛樂城推薦

首頁

刊登資訊

  • 刊登者:匿名
  • 時間:2021-06-07 22:40:10

尚未解答C/C++- 2D 陣列之記憶體位址有移位情形

C/C++- 2D 陣列之記憶體位址有移位情形

開發平台(Platform): (Ex: Win10, Linux, ...)
GNU/Linux

編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
GCC

額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
N/A

問題(Question):

印象中,

陣列不管是幾維的,記憶體位址應該是連續分佈,

但實際上有規則性跳躍的情況

想問各位,這樣的行為有專有名詞嗎?

謝謝




餵入的資料(Input):

請看下方程式碼

預期的正確結果(Expected Output):

預期 二維陣列 在 row 0 到 row 1 時,
記憶體的位址也是連續,
但實際上展現出來是會跳躍 找 0 尾數為 下一個 row 的開頭

錯誤結果(Wrong Output):

無錯誤,想知道是編譯器的問題,還是 C 語言的正常規格行為

程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)


int row = 2;
int col = 3;

// 建立 二維 int 陣列

int **arr = malloc(sizeof(int *) * row);

for(int i=0 ; i<row ; i++){
arr[i] = malloc(sizeof(int) * col);
}

// 填入數值

for(int i=0 ; i<row ; i++){
for(int j=0 ; j<col ; j++){
arr[i][j] = i+ ((j+1)*2);
}
}



當 row = 2, col = 3 時

row :0, col :0, arr[0][0] = 2, 0x55963ccf92c0
row :0, col :1, arr[0][1] = 4, 0x55963ccf92c4
row :0, col :2, arr[0][2] = 6, 0x55963ccf92c8
row :1, col :0, arr[1][0] = 3, 0x55963ccf92e0
row :1, col :1, arr[1][1] = 5, 0x55963ccf92e4
row :1, col :2, arr[1][2] = 7, 0x55963ccf92e8

可以看到 row 1 跟 row 2 中間從 92c8 跳到了 92e0 多跳了 4 bytes



當 row = 2, col = 4 時

row :0, col :0, arr[0][0] = 2, 0x55b7ab0542c0
row :0, col :1, arr[0][1] = 4, 0x55b7ab0542c4
row :0, col :2, arr[0][2] = 6, 0x55b7ab0542c8
row :0, col :3, arr[0][3] = 8, 0x55b7ab0542cc
row :1, col :0, arr[1][0] = 3, 0x55b7ab0542e0
row :1, col :1, arr[1][1] = 5, 0x55b7ab0542e4
row :1, col :2, arr[1][2] = 7, 0x55b7ab0542e8
row :1, col :3, arr[1][3] = 9, 0x55b7ab0542ec

這樣就正常



當 row = 2, col = 5 時

row :0, col :0, arr[0][0] = 2, 0x55eea8bac2c0
row :0, col :1, arr[0][1] = 4, 0x55eea8bac2c4
row :0, col :2, arr[0][2] = 6, 0x55eea8bac2c8
row :0, col :3, arr[0][3] = 8, 0x55eea8bac2cc
row :0, col :4, arr[0][4] = 10, 0x55eea8bac2d0

row :1, col :0, arr[1][0] = 3, 0x55eea8bac2e0
row :1, col :1, arr[1][1] = 5, 0x55eea8bac2e4
row :1, col :2, arr[1][2] = 7, 0x55eea8bac2e8
row :1, col :3, arr[1][3] = 9, 0x55eea8bac2ec
row :1, col :4, arr[1][4] = 11, 0x55eea8bac2f0

居然從 c2d0 多跳了 12 個 bytes 硬是跳到 c2e0 開頭



補充說明(Supplement):

N/A

--

0個答案 C/C++- 2D 陣列之記憶體位址有移位情形

其他問題

友站連結