C复制三维数组

时间:2013-10-30 23:39:12

标签: c++ c arrays memory copy

我有一个指向三维数组的指针,如下所示:

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项目。

有人能指出我正确的方向吗?

2 个答案:

答案 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';