【发布时间】:2013-10-04 18:39:00
【问题描述】:
如何将一个 3d 指针 memcpy 指向另一个 3d?我已经尝试了以下方法:
void somefunction(ArrayBlock **** b1, int noOfBlocks, ArrayBlock **** b2){
memcpy((&b2), (&b1), noOfBlocks*sizeof(ArrayBlock));
}
这在 gdb 中给了我以下错误:
[Inferior 1 (process 8528) exited with code 030000000005]
b1 和 b2 都在 main 函数中分配内存,如下所示:
ArrayBlock ***b2;
b2 = malloc(max_x * sizeof(ArrayBlock **));
for (i = 0; i < max_x; ++i)
{
b2[i] = malloc(max_y * sizeof(ArrayBlock *));
for (j = 0; j < max_y; ++j)
{
b2[i][j] = malloc(max_z* sizeof(ArrayBlock));
}
}
解决方案:
我想因为我的 3D 指针(数组)的初始化是不连续的,一个 memcpy 是不够的。
这就是我所做的:
int i2, j2;
for(i2 = 0; i2 < max_x; i2++){
for(j2 = 0; j2 < max_y; j2++){
memcpy(&(*b2)[i2][j2][0], &(*b1)[i2][j2][0], max_z*sizeof(ArrayBlock));
}
}
我认为这一次真的很有效,感谢那些帮助过我的人。
【问题讨论】:
-
因为没有“3D 指针”之类的东西。有 3D 数组和指针对指针的指针,它们并不相同。 [见此](c-faq.com/aryptr/aryptr2.html)。
-
看在上帝的份上,你为什么要通过
***? -
您是否意识到
&b1检索局部变量的地址,而不管您将什么传递给该函数? -
以这种方式分配 3D 数组(最常见的一种),不,它不会工作,因为包含实际值的缓冲区不连续。
-
不,不要记忆指针!如果你必须 memcpy 指针,你做错了什么。这将导致两个数组共享这些指针,并在您尝试释放数组时引发一场史诗般的大风暴。