如何在C中传递可变大小的多维数组?

时间:2015-05-04 19:02:06

标签: c arrays multidimensional-array

我正在尝试将三维数组传递给这样的函数:

void example( double*** bar ) {
    // Stuff
}

int main() {
    double[3][2][3] foo;
    // Initialize foo
    example( foo );
    return 0;
}

这会导致gcc给我“无效的指针类型”。我该怎么做呢?我可以让整个参数成为一维数组并安排我的数据以适应它,但是有更优雅的解决方案吗?

编辑:

另外,我不能总是指定每个子阵列的长度,因为它们的大小可能不同。 e.g:

int* foo[] = { { 3, 2, 1 }, { 2, 1 }, { 1 } };

如果它有帮助,我正试图在神经网络中批量传递神经元的输入。每个神经元都有不同数量的输入。

4 个答案:

答案 0 :(得分:3)

只需使用double*即可。多维数组连续存储在内存中,因此非常欢迎您自己动手。这就是在OpenGL上传递位图的方式。

答案 1 :(得分:2)

一维int数组在传递给函数时会衰减为int指针。多维数组衰减成指向下一个最低维度的数组的指针,即

void example(double (*bar)[2][3]);

这种语法有点令人费解,因此您可能会选择等效的语法:

void example(double bar[][2][3]) {
    // Stuff
}

int main() {
    double foo[3][2][3];

    example(foo);
    return 0;
}

不必给出第一个维度,它是"衰变"的那个部分。 (请注意,数组的维度不是像Java那样在类型上给出,而是在数组名称上。)

只要在数组之前传递维度,此语法也适用于可变长度数组(VLA):

void example(int x, int y, double (*bar)[x][y]) {
    // Stuff
}

int main() {
    double foo[3][2][3];

    example(2, 3, foo);
    return 0;
}

此功能需要C99且与C ++不兼容。

答案 2 :(得分:1)

如果数组大小已修复,您可以使用:

void example(double bar[][2][3]) {

}

否则,您可以将大小与数组一起传递给函数:

void example(size_t x, size_t y, size_t z, double bar[x][y][z]) {

}

答案 3 :(得分:0)

That can't be done in C the way you're thinking of. If you need a function that operates on variable-size multidimensional arrays, you'll either have to pass the sizes (all but one) explicitly to the function, or make a structure and pass that. I generally always make a structure when a 2D or 3D array is called for, even if they're of fixed size. I think it's just cleaner that way, since the structure documents itself.