【问题标题】:C, Dynamic allocation of a matrix: Why is this not allowed?C、矩阵的动态分配:为什么不允许这样做?
【发布时间】:2018-04-22 13:15:01
【问题描述】:

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

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

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

【问题讨论】:

  • fg 接受指向 int 的指针,而不是数组。
  • allocate_mem 不是标准 C。使用 malloc 或类似的
  • @melpomene 我的印象是数组只是指向第一个元素,但在阅读了 StoryTeller 链接的帖子后,它们似乎并不完全相同,并且将被视为不同的数据类型?
  • @HereBeeBees 数组和指针甚至不一样。他们没有任何共同点;只是数组可以隐式转换为指针(这在大多数情况下都会发生)。

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


【解决方案1】:

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

这是一个可以理解的错误,因为 C(和 C++)的“数组到指针衰减”。有时你可以引用一个数组,并获得一个指向它的第一个元素的指针;有时它是实际的数组 - 取决于上下文。使用二维数组,它变得更加奇怪,因为二维数组可以在 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."

【讨论】:

  • 我明白了!谢谢,我会检查这些链接。
猜你喜欢
  • 1970-01-01
  • 2011-08-17
  • 2013-09-07
  • 2017-02-24
  • 1970-01-01
  • 2020-05-01
  • 2011-10-14
  • 2012-08-30
  • 2023-03-03
相关资源
最近更新 更多