0

我正在尝试在 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 二维数组。语法是什么(编译器对上述行给出错误...)?

4

3 回答 3

3

我认为你需要这个:

 //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));
于 2012-09-14T20:39:36.473 回答
0

这是使用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.boardand分配额外的空间g.originalBoard- 只要您为自己分配空间,这两个字段就会自动分配g。此外,您可以使用g.board[r][c]而不是g.board[r * 9 + c].

于 2012-09-14T20:34:26.270 回答
0

顺便说一句,如果您尝试在阵列上执行以下“预期”任务,

int* g.originalBoard[9][9]=malloc(sizeof(g.board[9][9]));

那么您应该将上面的行更改为

int* g.originalBoard[8][8]=malloc(sizeof(g.board[8][8]));

因为这是一个 9x9 的二维数组,而在 C 中,数组是基于零的。

于 2014-04-23T15:16:06.133 回答