You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将动态分配的int**二维数组内容复制到另一个二维数组?

为什么不能用简单解引用复制?

你代码里的*board2 = board1是完全错误的,核心原因有两点:

  1. 类型不匹配:board1是int**类型,*board2是int*类型,直接赋值会触发编译警告甚至错误,属于非法类型转换。
  2. 逻辑完全错误:就算强行通过编译,这也只是把board1的指针地址赋值给board2的第一个行指针,结果是:
    • board2原本通过createBoard分配的6行内存会丢失,造成内存泄漏;
    • 后续操作board2时会直接修改board1的内存,两个“棋盘”共享同一块数据,完全达不到复制的目的。

普通变量的解引用复制可行,是因为它们的值直接存储在栈上;而你的二维棋盘是动态分配的多层指针结构,不能通过简单的指针赋值完成内容复制。


正确的复制实现方式

针对你这种“外层指针数组+每行独立malloc”的棋盘结构,需要逐行复制内容,以下是两种常用方案:

方案1:用memcpy逐行复制(基于已创建的空棋盘)

既然你已经通过createBoard创建了board2(已分配好内存并初始化为0),只需要遍历每一行,用memcpy把board1对应行的内容复制过去:

// 替换main函数里错误的*board2 = board1;
for (int i = 0; i < 6; i++) {
    memcpy(board2[i], board1[i], 7 * sizeof(int));
}

memcpy可以直接复制整块连续内存,效率比循环逐个赋值更高。

方案2:封装专门的copyBoard函数

如果需要频繁复制棋盘,可以封装一个函数,负责创建新棋盘并完成复制:

// 复制棋盘的工具函数
int **copyBoard(int **srcBoard) {
    // 先创建一个空棋盘
    int **newBoard = createBoard();
    // 逐行复制内容
    for (int i = 0; i < 6; i++) {
        memcpy(newBoard[i], srcBoard[i], 7 * sizeof(int));
    }
    return newBoard;
}

在main函数中调用:

int **board1 = createBoard();
insert(board1, 2, 1);
insert(board1, 5, 2);
// 直接得到复制后的棋盘
int **board2 = copyBoard(board1);

额外注意事项

  • 记得在程序结束时释放棋盘内存,避免泄漏,建议封装freeBoard函数:
void freeBoard(int **board) {
    for (int i = 0; i < 6; i++) {
        free(board[i]); // 先释放每行的内存
    }
    free(board); // 再释放外层指针数组
}
  • 如果你的棋盘是连续内存分配的二维数组(比如一次性malloc(6*7*sizeof(int))后转成二维指针),可以直接用一次memcpy复制整个数组,但你的createBoard是每行独立分配,因此必须逐行处理。

内容的提问来源于stack exchange,提问作者Diana Farhat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:45:36