【发布时间】:2014-02-08 13:16:00
【问题描述】:
另一个与此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
它对我来说很神秘。我在这段代码中有什么样的错误?还是有一些替代解决方案?
【问题讨论】:
-
现在你是three-star programmer,恭喜。 ;)
-
我有个借口,因为最初它不是我的代码 =)
-
然后通过编写一个 3D 数组类来修复它,该类保存和管理一个连续的块,并通过三个索引提供对元素的访问:)
-
如果你只想对你的代码做小的改动(而不是重写它,正如@juanchopanza 所建议的那样),尝试删除所有的演员表。您的代码使用它们来隐藏编译错误;删除它们将显示错误;那么你可以修复它们。
-
你真的应该完全抛弃代码,并使用类似thisextended 的东西来获取第三维。这可以在对其他代码影响很小或没有影响的情况下完成(除了加速和消除崩溃)。
标签: c++ memory-management multidimensional-array