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

标签 c memory-management multidimensional-array

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

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

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/

相关文章:

c - 写系统调用

c - 如何计算局部变量和用户定义函数的循环执行次数? C语言

c - 转义十六进制序列

function - 函数应该有多短?

memory-management - 释放先前分配给变量的内存(使用创建)

javascript - 如何用空值预填充数组?

c - Malloc 在递归函数中崩溃

testing - 低内存开销 XML 解析

c++ - 这个 C++ 代码是可移植的吗? (假设多维数组有连续的内存布局)

python - 是否有用于小型游戏的二维数组的 Python 模块/配方(不是 numpy)