我有一个指向三维数组的指针,如下所示:
char ***_cube3d
我正在初始化它:
_cube3d = (char ***)malloc(size * (sizeof(char**)));
for (int i = 0; i< size; i++) {
_cube3d[i] = (char **)malloc(size * sizeof(char*));
for (int j = 0; j<size; j++) {
_cube3d[i][j] = (char *)malloc(size * sizeof(char));
}
}
请注意,该数组是动态大小的,可以包含数千个元素,因此我们不能提前将其声明为数组。
现在,我想尽可能高效地将其所有内容复制到另一个数组中。我知道嵌套循环解决方案,我们逐个复制每个元素,但是,对我来说这似乎是非常低效的。有没有办法加快这个过程? C ++代码是受欢迎的,虽然我更喜欢它在普通的C中,因为我打算将这个解决方案迭代到Objective C中,我想避免将C ++代码注入一个干净的Objective C项目。
有人能指出我正确的方向吗?
答案 0 :(得分:3)
使用您已有的内容(但使用malloc
修复第一个sizeof(char***)
)
您可以通过运行一堆for循环来复制数组:
char new_cube[side][side][side];
for(unsigned int x = 0; x < side; x++)
for(unsigned int y = 0; y < side; y++)
for(unsigned int z = 0; z < side; z++)
new_cube[x][y][z] = old_cube[x][y][z];
OR:
char new_cube[side][side][side];
for(unsigned int x = 0; x < side; x++)
for(unsigned int y = 0; y < side; y++)
memcpy(new_cude[x][y], old_cube[x][y], sizeof(char)*side);
可能会快一些。
使用此方法可以避免使用任何c ++(正如您所说的那样),并且您的代码复杂性保持最小。
答案 1 :(得分:2)
如果您使用的是C.99,则可以使用可变长度数组(VLA)动态分配3维数组。确定side
后,您可以将指针声明为:
char (*cube3d_)[side][side];
然后像这样初始化它:
cube3d_ = malloc(side * sizeof(*cube3d_));
请注意,在C中,您不需要转换malloc()
的返回值,这样做实际上可能导致最坏情况下的未定义行为。自&#34;立方体&#34;已被分配为连续块,可以使用memcpy()
复制。
C ++没有VLA。您可以使用vector
来获得与多动态分配结构相当的C ++:
std::vector<std::vector<std::vector<char> > >
cube3d_(side, std::vector<std::vector<char> >(side, std::vector<char>(side)));
然后,您可以使用复制构造函数或赋值来复制它。
如果cube3d_
是对象/结构的成员变量,只要您的对象知道side
的值,您仍然可以使用VLA指针访问内存。例如:
struct Obj {
size_t side_;
void *cube3d_;
};
//...
size_t side = 3;
//...
Obj o;
o.side_ = side;
char (*p)[o.side_][o.side_] = malloc(o.side_ * sizeof(*p));
o.cube3d_ = p;
//...
char (*q)[o.side_][o.side_] = o.cube3d_;
q[1][2][2] = 'a';