C,矩阵的动态分配:为什么不允许这样做?

C, Dynamic allocation of a matrix: Why is this not allowed?

所以我在一些讲义中有下面的例子

void f(int **p){}
void g(int *p[]){}
void h(int p[2][3]){}

int main(){
   int **a;
   allocate_mem(a); // allocate memory for a
   f(a); // OK!
   g(a); // OK!
   // h(a); // NOT OK
   int b[2][3];
   // f(b); // NOT OK
   // g(b); // NOT OK
   h(b); // OK!
   return 0;
}

(没有进一步的 explanation/comments)。我很难理解为什么 f(b) 和 g(b) 是非法的。这两个函数都设计为接受二维数组,我们用一个来调用它们。这怎么行不通?我认为区别在于内存的分配,但这将如何影响函数接受它作为输入的方式?

您将指针与数组混为一谈,将指向指针的指针与二维数组混为一谈。

由于 C(和 C++)的 "array-to-pointer decay",这是一个可以理解的错误。有时您可以引用一个数组,并获得指向其第一个元素的指针;有时它是实际的数组 - 取决于上下文。对于二维数组,它变得更加奇怪,因为二维数组可以在 less 位置使用,而不是指向元素的指针(但仍然可以使用在 一些 类似的地方)。

请花几分钟阅读 C 语言常见问题解答 Section 6 中的指针和数组之间的关系和区别。您的具体问题也出现在那里:

Q 6.18: "My compiler complained when I passed a two-dimensional array to a function expecting a pointer to a pointer."