C.malloc中的深度复制数组



我正试图在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.boardg.originalBoard只是指针,而不是数组。或者,如果您可以控制g类型的定义,则可以将矩阵的大小硬编码为

struct foo {
    int board[9][9];
    int originalBoard[9][9];
    /* Other fields here */
};

这样就不必为g.boardg.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数组中是基于零的。

相关内容

  • 没有找到相关文章

最新更新