Вы не можете назначать массивы в C. Это просто не разрешено. Когда вы написали:
int grid[3][3] = node->grid;
вы пытались инициализировать локальный массив, grid
, из переданного в node
. Если бы это было разрешено (а это не так), то вам не понадобился бы цикл впоследствии.
Вы можете назначать структуры, даже если они содержат массивы, поэтому, если локальная структура была Node
, вы могли бы написать:
Node local = *node;
Для инициализации local
.
вам не нужно будет последовательно проходить по массивам.
Вы можете перебирать массивы, копируя по одному элементу за раз:
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
grid[i][j] = node->grid[i][j];
Вы также можете использовать memmove()
или memcpy()
:
int grid[3][3];
assert(sizeof(grid) == sizeof(node->grid));
memcpy(grid, node->grid, sizeof(grid));
Одно время предлагался другой ответ:
Изменить строку:
int grid[3][3] = node->grid;
до:
int **grid = node->grid;
Я заметил, что это не сработает - и мне было законно предложено объяснить, почему. Это требует места и форматирования.
Прежде всего, примечания компилятора:
warning: initialization from incompatible pointer type
То есть «ты играешь с огнем».
Предположим, мы игнорируем это предупреждение. Локальный grid
теперь указывает на верхний левый угол массива (если вы видите, что массивы растут вниз и поперек слева направо). Сохраненное там значение представляет собой простое число, а не инициализированный указатель, но когда компилятор оценивает grid[0]
, он вынужден предположить, что будет создан указатель. Если node->grid[0][0]
содержит ноль, вы, вероятно, получите ошибку сегментации и дамп ядра для разыменования нулевого указателя (при условии, что указатели и int
имеют одинаковый размер, что обычно верно для 32-разрядных систем), или некоторое другое неопределенное поведение. Если node->grid[0][0]
содержит другое значение, то поведение все еще не определено, но не настолько предсказуемо.