在C中传递2D指针数组
对于我的程序,我需要在一个单独的文件中传递一个指向函数的2D指针数组。我在下面编写了一个类似的语法文件:在C中传递2D指针数组,c,arrays,pointers,C,Arrays,Pointers,对于我的程序,我需要在一个单独的文件中传递一个指向函数的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 incom
#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;
}
#包括
#包括
类型定义结构{
int状态;
int设计;
}卡片;
卡套[5][5];
void setFirst(card_t*cards[][]){//state=1;
}
int main(){
setFirst(cardSet);//如果将数组传递给函数,则必须指定内部数组的大小,而不是void setFirst(card\t*cards[][])
,应指定void setFirst(card\t*cards[][5])
为什么需要指定它而不是第一个维度的大小
因为卡片是一个卡片指针数组,如果你想进入卡片[1][0],编译器需要知道向指针添加多少卡片cards
-卡片被声明:card\t*cards[5][4]
它需要添加4*sizeof(*card\t)
才能进入卡片[1][0],但是如果卡片被声明:card\t*cards[5][5]
需要添加5*sizeof(*card\u t)
才能访问卡片[1][0]。只有第一个索引是可选的。您应该明确提到第二个索引,因为二维数组会衰减为指向1d数组的指针
void setFirst(card_t *cards[][5]) {
// ^ Newly added
// ..
}
还要确保指针指向有效的内存位置。否则,取消引用会导致分段错误。顺便问一下,是否有理由使用带有指针的二维数组。我认为这只是使程序复杂化。为了实现与您尝试的类似的效果,C99使用了可变长度数组。这些都是它的一部分函数定义非常方便:
void setFirst(size_t n, size_t m, card_t *cards[n][m]) {
...
}
注意,在声明数组时必须知道大小参数,因此必须将它们放在前面。如前所述,要将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)
相同,因此可以传递两个指针而不是数组维度