为什么我必须在将二维数组传递给C函数时提供维度?

Sea*_*red 2 c memory-management multidimensional-array

我不确定标签是否相关,但可以随意添加它.我认为原因是历史性的,这就是我建议的原因.

为什么我不能声明如下的函数签名?

void foo(int doubly_indexed_array[][]) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

这使

$ gcc mem.c
mem.c:4: error: array type has incomplete element type
Run Code Online (Sandbox Code Playgroud)

为什么必须声明其中一个尺寸,如下所示?

void foo(int doubly_indexed_array[][10]) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*tin 7

你需要声明第二个而不仅仅是一个.它与内存布局有关,2-d数组连续存储在内存中,这意味着所有第二维数组都是连续的.

所以对于int[2][2]内存布局看起来像(假设初始化为0):

[[0, 0][0, 0]]
Run Code Online (Sandbox Code Playgroud)

例如,编译器必须知道在第一维上进行索引时增加指针的数量.因此,如果一个int数组被命名为a,

a[i][j] 是真的 (address of a) + i*sizeof(int)*second_dimension + j*sizeof(int)

所有这些都需要在编译时知道,因此编译器可以生成代码.