连续分配多维阵列
Allocate multidimensional array contiguously
与此有关的另一个问题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
在执行时间我在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
它看起来很神秘。我在此代码中遇到什么样的错误?还是有一些替代解决方案?
a[i] = (T**)(buff + (i * y * z));
您将一些指针存储在缓冲区本身中。我怀疑这是故意的。尝试以下操作:
a[i] = new T*[y];
这个很好,因为它应该指向缓冲区内:
a[i][j] = (T*)(buff + i*y*z + j*z);
相关文章:
- 二维阵列的动态分配
- 为什么删除分配的阵列会导致内存错误?
- 新的阵列分配
- 分配给阵列时出现分段错误?黑客排名 2D 阵列 - DS.
- 分配/访问2d阵列,使得2d子块是连续的
- 重新分配2D阵列并删除旧阵列
- 轻松C++阵列分配
- 英特尔并行工作室 2015 C++中的 2D 动态分配全局阵列
- 为阵列分配空间
- 无效的char阵列分配
- C++ 2D 阵列分配内存以避免分段错误
- C++ 2D 动态阵列分配
- 全局阵列分配 -- 堆栈或堆
- 阵列分配后跟 memcpy 或带储备的向量
- 在 2D 阵列分配期间对 calloc 进行"expression must have (pointer-to) function type"
- 为动态分配的阵列分配更多内存
- C++全局阵列分配
- 阵列分配问题
- 堆阵列分配而不是堆栈上的堆数组分配
- 使用C++new[]为2D阵列分配内存