对于我的程序,我需要将一个2D数组指针传递给一个单独的文件中的函数。我在下面写了一个类似语法的文件:
#include <stdlib.h>
#include <stdio.h>
typedef struct {
int state;
int design;
} card_t;
card_t *cardSet[5][5];
void setFirst(card_t *cards[][]) { // <- Error: Array has incomplete element type
cards[0][0]->state = 1;
}
int main() {
setFirst(cardSet); // <- Error: Type of formal parameter 1 is incomplete
return 0;
}
当我将代码更改为所有1D数组时,它编译得很好,但对于2D数组,我得到上面显示的错误。这两种情况有什么区别?
谢谢! 卡梅伦
答案 0 :(得分:1)
如果将数组传递给函数,则必须指定内部数组的大小,而不是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]。
答案 1 :(得分:1)
正如已经提到的,要将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)
相同,因此您可以传递两个指针而不是数组维度。
答案 2 :(得分:0)
只有第一个索引是可选的。你肯定应该提到第二个索引,因为二维数组会衰减到指向1d数组的指针。
void setFirst(card_t *cards[][5]) {
// ^ Newly added
// ..
}
还要确保指针指向有效的内存位置。否则解除引用会导致分段错误。顺便说一下,有没有理由有一个带指针的二维数组。我认为你只是使程序复杂化。
答案 3 :(得分:0)
为了实现类似于你正在尝试的东西,C99有可变长度数组。这些在函数定义中特别方便:
void setFirst(size_t n, size_t m, card_t *cards[n][m]) {
...
}
注意你必须在数组声明时知道大小参数,所以你必须把它们放在前面。