传递多维数组

3
我知道对于一维数组,我可以使用...
void g(int x[]) {}

void f(int a, int b)
{
    int x[a];
    g(x);
}

但是有这样的代码...
void f(int a, int b)
{
    int x[a][b][4];
    g(x);
}
的类型签名会是什么样子?

你的代码无法编译。你不能将一个变量作为数组长度。 - Brian Clements
3
这是C语言,不是C90。它可以在任何现代编译器上编译通过。在gcc上可能需要使用-std=c99标志。 - Clark Gaebel
2个回答

5
void g(int x[][b][4]) // b must be known in advance
{}

否则,显式传递b
例如:
void g(int b,int x[][b][4]){ 

} 

int main() 
{ 
    int a=4,b=6; 
    int x[a][b][4]; 
    g(b,x); 
    return 0; 
}

1
哦,我可以传入b吗?那就改变了一切。谢谢! - Clark Gaebel
1
请注意,在函数g()中,sizeof x[0]的值取决于传递的b值,可能会在函数的不同调用之间有所不同。 - caf

0

你需要指定数组的大小:

void g(int x[][2][3]){ 
    /* stuff */
} 

int main() 
{ 
    int x[1][2][3]; 
    g(x); 
    return 0; 
}

对我不起作用。Clang:there.c:185:43: 警告:将 '_Bool [problem.gridSize.x + 1][problem.gridSize.y + 1][4]' 传递给类型为 '_Bool ***' 的参数时,指针类型不兼容。 - Clark Gaebel
不遵循格式。1和2事先未知,它们是变量。它必须是[a][b]。 - Clark Gaebel
我对你的编译器不熟悉,很抱歉。你可能会考虑将它们作为指向动态内存的指针处理。这样你就不必担心事先不知道它们了。 - Brian Clements

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接