2014-01-19 83 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