在C中传递2D指针数组

对于我的程序,我需要将一个2D数组指针传递给一个单独文件中的函数。 我在下面写了一个类似语法的文件:

#include  #include  typedef struct { int state; int design; } card_t; card_t *cardSet[5][5]; void setFirst(card_t *cards[][]) { // state = 1; } int main() { setFirst(cardSet); // <- Error: Type of formal parameter 1 is incomplete return 0; } 

当我将代码更改为所有1D数组时,它编译得很好,但对于2D数组,我得到上面显示的错误。 这两种情况有什么区别?

谢谢! 卡梅伦

如果你将一个数组传递给一个函数,你必须指定内部数组的大小,在你的情况下,而不是void setFirst(card_t *cards[][]) ,你应该指定void setFirst(card_t *cards[][5])

为什么需要指定它而不是第一维的大小?

由于cards是一个card_t指针数组的数组,如果你想获得卡[1] [0],编译器将需要知道添加到指针cards – 卡被声明: card_t *cards[5][4]它需要添加4 * sizeof(*card_t)才能获得卡[1] [0],但如果声明卡片: card_t *cards[5][5]则需要添加5 * sizeof(*card_t)去卡[1] [0]。

如前所述,要将2d数组传递给函数,您需要拥有每个维度但第一个声明。 但是,您也可以只传递指针,如下所示。 请注意,您应该始终(除非数组维度完全固定且对数组运行的函数仅在数组的维度内运行)也传递每个数组的长度。

 void setFirst(card_t ***cards, size_t n, size_t m) { if (n > 0 && m > 0) { cards[0][0]->state = 1; } } 

因为通过code[0][0]引用数组与*(*(code+0)+0*m) ,所以可以传递两个指针而不是数组维度。

只有第一个索引是可选的。 你应该提到第二个索引,因为二维数组衰减到指向1d数组的指针。

 void setFirst(card_t *cards[][5]) { // ^ Newly added // .. } 

还要确保指针指向有效的内存位置。 否则解除引用会导致分段错误。 顺便说一下,有没有理由有一个带指针的二维数组。 我认为你只是使程序复杂化。

为了实现类似于你正在尝试的东西,C99有可变长度数组。 这些function定义特别方便:

 void setFirst(size_t n, size_t m, card_t *cards[n][m]) { ... } 

请注意,您必须在数组声明时知道大小参数,因此您必须将它们放在前面。