【问题标题】:Allocate multidimensional array contiguously连续分配多维数组
【发布时间】: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


【解决方案1】:
a[i] = (T**)(buff + (i * y * z));

您将一些指针存储在缓冲区本身内。我怀疑这是故意的。试试这个:

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

这个很好,因为它应该指向缓冲区内:

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

【讨论】:

  • 还要确保在最终删除 a 之前,先删除 a[i](对于每个 i 值)。
猜你喜欢
  • 2021-12-02
  • 1970-01-01
  • 2018-02-03
  • 2019-07-27
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
相关资源
最近更新 更多