贊助廠商

娛樂城推薦

首頁

電腦與網際網路/其他:電腦列表

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, 0x55963ccf92c0row :0, col :1, arr[0][1] = 4, 0x55963ccf92c4row :0, col :2, arr[0][2] = 6, 0x55963ccf92c8row :1, col :0, arr[1][0] = 3, 0x55963ccf92e0row :1, col :1, arr[1][1] = 5, 0x55963ccf92e4row :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, 0x55b7ab0542c0row :0, col :1, arr[0][1] = 4, 0x55b7ab0542c4row :0, col :2, arr[0][2] = 6, 0x55b7ab0542c8row :0, col :3, arr[0][3] = 8, 0x55b7ab0542ccrow :1, col :0, arr[1][0] = 3, 0x55b7ab0542e0row :1, col :1, arr[1][1] = 5, 0x55b7ab0542e4row :1, col :2, arr[1][2] = 7, 0x55b7ab0542e8row :1, col :3, arr[1][3] = 9, 0x55b7ab0542ec這樣就正常當 row = 2, col = 5 時row :0, col :0, arr[0][0] = 2, 0x55eea8bac2c0row :0, col :1, arr[0][1] = 4, 0x55eea8bac2c4row :0, col :2, arr[0][2] = 6, 0x55eea8bac2c8row :0, col :3, arr[0][3] = 8, 0x55eea8bac2ccrow :0, col :4, arr[0][4] = 10, 0x55eea8bac2d0row :1, col :0, arr[1][0] = 3, 0x55eea8bac2e0row :1, col :1, arr[1][1] = 5, 0x55eea8bac2e4row :1, col :2, arr[1][2] = 7, 0x55eea8bac2e8row :1, col :3, arr[1][3] = 9, 0x55eea8bac2ecrow :1, col :4, arr[1][4] = 11, 0x55eea8bac2f0居然從 c2d0 多跳了 12 個 bytes 硬是跳到 c2e0 開頭補充說明(Supplement):N/A--
  • 發問日期:2021-06-07 22:40:10

友站連結