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)
你需要声明第二个而不仅仅是一个.它与内存布局有关,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)
所有这些都需要在编译时知道,因此编译器可以生成代码.