我正试图在C中制作一个数组的深度副本(originalBoard是副本):
int gy, gx;
for (gy=0; gy<9; gy++)
{
for (gx=0; gx<9; gx++)
{
g.originalBoard[gy][gx]=g.board[gy][gx];
}
}
这似乎不起作用,我猜这只是指向原始的板阵列。
那么解决方案是尝试使用malloc吗?类似:
int* g.originalBoard[9][9]=malloc(sizeof(g.board[9][9]));
顺便说一句,这是一个9x9的二维数组。语法是什么(编译器为上面的行给出了一个错误…)?
我想你需要这个:
//assuming g.originalBoard is array of array of integers and same for g.board
int *originalBoard = malloc(sizeof(g.board));
memcpy(originalBoard, g.board, sizeof(g.board));
这是使用memcpy的正确位置。你可能想要
g.originalBoard = (int *)malloc(9 * 9 * sizeof(int));
if (NULL == g.originalBoard) {
/* malloc failed, so handle the error somehow */
}
memcpy(g.originalBoard, g.board, 9 * 9 * sizeof(int));
您可能会注意到,在上面的解决方案中,您必须使用g.board[r * 9 + c]
来访问索引(r,c)处的项,而不是两个索引。这是因为它动态分配内存的方式——在编译时,g.board
和g.originalBoard
只是指针,而不是数组。或者,如果您可以控制g
类型的定义,则可以将矩阵的大小硬编码为
struct foo {
int board[9][9];
int originalBoard[9][9];
/* Other fields here */
};
这样就不必为g.board
和g.originalBoard
分配额外的空间了——只要为g
本身分配空间,这两个字段就会自动分配。此外,您可以使用g.board[r][c]
而不是g.board[r * 9 + c]
。
顺便说一句,如果您试图在数组上执行以下"预期"任务,
int*g.originalBoard[9][9]=malloc(sizeof(g.board[9][9]));
那么你应该把上面的线改成
int*g.originalBoard[8][8]=malloc(sizeof(g.board[8][8]));
因为这是一个9x9二维数组,并且在C数组中是基于零的。