我不确定 history标签是相关的,但可以随意添加。 我认为原因是历史原因,这就是我建议这样做的原因。
为什么我不能声明如下所示的函数签名?
void foo(int doubly_indexed_array[][]) {
...
}
给出
$ gcc mem.c
mem.c:4: error: array type has incomplete element type
为什么必须声明如下维度之一?
void foo(int doubly_indexed_array[][10]) {
...
}
最佳答案
您需要声明第二个而不是唯一一个。它与内存布局有关,二维数组连续存储在内存中,这意味着所有二维数组都是连续的。
int[2][2]
的内存布局如下(假设初始化为 0):
[[0, 0][0, 0]]
例如,在第一个维度上建立索引时,编译器必须知道将指针递增多少。所以如果一个 int 数组被命名为 a,
a[i][j]
实际上是 (a 的地址) + i*sizeof(int)*second_dimension + j*sizeof(int)
所有这些都需要在编译时知道,以便编译器可以生成代码。
关于c - 为什么在将二维数组传递给 C 函数时必须提供维度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21691924/