将2D数组分配给结构中的2D数组

Jeu*_*une 3 c

我有一个函数试图循环结构中的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)

有一次,另一个答案表明:

换行:

int grid[3][3] = node->grid;
Run Code Online (Sandbox Code Playgroud)

至:

int **grid = node->grid;
Run Code Online (Sandbox Code Playgroud)

我注意到这不起作用 - 并且合理地挑战解释原因.这需要空间和格式.

首先,编译器注意到:

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]包含另一个值,那么行为仍然是未定义的,但不是那么可预测.