数组作为结构的一部分

时间:2018-09-23 20:12:42

标签: c arrays struct

我对C还是很陌生,使用数组作为struct的一部分时有点麻烦。我有一个结构定义如下:

typedef struct
{
 int row;
 int col;
 int * puzzle[5][5]
} data;

稍后在函数中,我尝试如下使用此结构:

void foo(int grid[5][5])
{
 data *puz = (data *)malloc(sizeof(data));
 puz->row = 3;
 puz->col = 2;
 puz->puzzle = grid;  // causes an error
 }

最后一条语句产生错误“分配给具有数组类型的表达式”。我知道这与等号和数组数据结构有关,但是我不确定如何解决这个问题。任何帮助是极大的赞赏。谢谢。

2 个答案:

答案 0 :(得分:2)

这个...

    int * puzzle[5][5]

...将puzzle声明为5个数组,每个数组包含5个指针 int。通俗地讲,我们通常将这种事物称为5 x 5数组,但是您应该意识到的关键是标量元素的基本类型是指针类型。这与函数int的参数的标量元素类型(foo)不匹配,并且无论如何都不是您想要的。 (还要注意,您的代码在该成员的声明之后省略了必需的分号。)

似乎该结构成员应该改为声明为...

int puzzle[5][5];

...,即int的2D数组。 C没有完整的数组分配,因此在这种情况下,您需要以其他方式将功能参数复制到新结构中。您可以编写一组嵌套循环,但是使用memcpy()更简单:

memcpy(&puz->puzzle, grid, sizeof(puz->puzzle));

在极少数情况下,您希望结构包含指向数组的指针,则可以将其声明为

int (*puzzle)[5];

int (*puzzle)[5][5];

甚至

int *puzzle;

您选择的哪个会影响您分配给成员的方式以及访问int数组元素的方式。由于我认为这些都不是您真正想要的,所以我将细节保留为练习。

答案 1 :(得分:0)

我认为您应该使用指向数组的指针来调用函数,并相应地修改函数签名。 但是,如果要复制数组而不是指向数组,则应执行类似memcpy的操作。

相关问题