C、动态分配一个矩阵: Why is this not allowed?

标签 c pointers multidimensional-array pointer-to-pointer

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

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;
}

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

最佳答案

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

由于 C(和 C++)的“数组到指针衰减”,这是一个可以理解的错误。有时您可以引用一个数组,并获得指向其第一个元素的指针;有时它是实际的数组 - 取决于上下文。对于二维数组,它变得更加奇怪,因为二维数组可以在较少的地方使用,而不是指向元素的指针(但仍然可以在中使用>一些这样的地方)。

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

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

关于C、动态分配一个矩阵: Why is this not allowed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49966307/

相关文章:

c - 等同于 C 中的 NULL

c++ - c++ final 非虚拟类是否被重新解释为可以安全使用的数组?

c - 如何在 c 中返回 char (*)[6]?

c - 如何通过保持其他单元格值不变来获取二维数组的一个单元格中的值,然后如何应用 Qsort?

python - 如何从分隔列表创建关联数组?

c - C语言中的循环中断

c - 使用两个源文件编译内核模块时出错

c - 为什么函数 'lower' 的返回类型和输入类型都是 int?

C++ 为函数中从文件读取的对象和整个程序可访问的数据分配内存

c - 在c中for循环一个指针char