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