我有一个函数试图循环结构中的2D数组:
typedef struct node
{
int grid[3][3];
} Node;
void someFunction(Node *node) {
int grid[3][3] = node->grid;
//loop through
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译它时,我得到了一个
mp.c:42:错误:初始化程序无效
Jon*_*ler 11
您无法在C中分配数组.这是不允许的.你写的时候:
int grid[3][3] = node->grid;
Run Code Online (Sandbox Code Playgroud)
你试图grid从传入的初始化本地数组node.如果允许(不是这样),那么之后你就不需要循环了.
但是,您可以分配结构,即使它们包含数组,因此如果本地结构是a Node,您可以编写:
Node local = *node;
Run Code Online (Sandbox Code Playgroud)
之后您不需要循环遍历数组以进行初始化local.
您可以遍历数组,一次复制一个元素:
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
grid[i][j] = node->grid[i][j];
Run Code Online (Sandbox Code Playgroud)
您还可以使用memmove()或memcpy():
int grid[3][3];
assert(sizeof(grid) == sizeof(node->grid));
memcpy(grid, node->grid, sizeof(grid));
Run Code Online (Sandbox Code Playgroud)
有一次,另一个答案表明:
换行:
Run Code Online (Sandbox Code Playgroud)int grid[3][3] = node->grid;至:
Run Code Online (Sandbox Code Playgroud)int **grid = node->grid;
我注意到这不起作用 - 并且合理地挑战解释原因.这需要空间和格式.
首先,编译器注意到:
warning: initialization from incompatible pointer type
Run Code Online (Sandbox Code Playgroud)
那就是说'你正在玩火'.
我们假设我们忽略了这个警告.本地grid现在指向数组的左上角(如果您看到数组逐渐增长并且从左到右).存储在那里的值是一个普通的数字,而不是一个初始化的指针,但是当编译器评估时grid[0],它被强制假设会产生一个指针.如果node->grid[0][0]包含零,则可能会出现分段错误和核心转储以取消引用空指针(假设指针和int大小相同,这在32位系统上通常是正确的),或者其他一些未定义的行为.如果node->grid[0][0]包含另一个值,那么行为仍然是未定义的,但不是那么可预测.