2014-01-19 115 views
1

與此相關的https://stackoverflow.com/a/21213612/1423473分配多維數組連續

我想爲3D陣列分配內存的另一個問題連續

T* buff = new T [x * y * z]; 
    for(int i = 0; i < x * y * z; i++) { 
     buff[i] = 2; // 2 for debug purposes 
    } 

    T*** a = new T **[x]; 
    for(int i=0; i<x; ++i) 
    { 
     a[i] = (T**)(buff + (i * y * z)); 
     for(int j=0; j<y; ++j) 
     { 
      a[i][j] = (T*)(buff + i*y*z + j*z); 
      for(int k=0; k<z; ++k) 
      { 
       a[i][j][k] = 0; 
      } 
     } 
    } 

此代碼導致該行a[i][j][k] = 0

在以SIGSEGV執行時間我有這個結果gdb

(gdb) n 
343     a[i][j] = (T*)(buff + i*y*z + j*z); 
(gdb) x/20d buff 
0xbb7350: 2 2 2 2 
0xbb7360: 2 2 2 2 
0xbb7370: 2 2 2 2 
0xbb7380: 2 2 2 2 
0xbb7390: 2 2 2 2 
(gdb) x/20d a 
0x87ac80: 12284752 0 8955856 0 
0x87ac90: -134410640 32767 -288938360 32767 
0x87aca0: -134496320 32767 -288949632 32767 
0x87acb0: -288949584 32767 -288949536 32767 
0x87acc0: -134300384 32767 -134795808 32767 
(gdb) n 
345     for(int k=0; k<z; ++k) 
(gdb) x/20d buff 
0xbb7350: 12284752 0 2 2 
0xbb7360: 2 2 2 2 
0xbb7370: 2 2 2 2 
0xbb7380: 2 2 2 2 
0xbb7390: 2 2 2 2 
(gdb) print (int)buff 
$6 = 12284752 

它看起來很神祕。這段代碼有什麼樣的錯誤?或者有一些替​​代解決方案?

+2

現在你是[三星級的程序員(http://c2.com/cgi/wiki?ThreeStarProgrammer),恭喜。 ;) – Shoe

+0

我有一個藉口,因爲最初它不是我的代碼=) – erthalion

+0

然後通過編寫一個3D數組類來修復它,該類包含並管理一個連續的塊,並通過三個索引提供對元素的訪問:) – juanchopanza

回答

1
a[i] = (T**)(buff + (i * y * z)); 

您正在存儲緩衝區本身內的一些指針。我懷疑這是故意的。試試這個:

a[i] = new T*[y]; 

這一個是好的,因爲它應該緩衝區內的點:

a[i][j] = (T*)(buff + i*y*z + j*z); 
+0

是的,看起來你是對的 - 感謝您的幫助=) – erthalion

+0

還要確保在最終刪除之前,您刪除了[i](對於每個i值)。 – immibis