Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中传递2D指针数组_C_Arrays_Pointers - Fatal编程技术网

在C中传递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

对于我的程序,我需要在一个单独的文件中传递一个指向函数的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;
}
#包括
#包括
类型定义结构{
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)
相同,因此可以传递两个指针而不是数组维度