如何将动态分配的int**二维数组内容复制到另一个二维数组?
为什么不能用简单解引用复制?
你代码里的*board2 = board1是完全错误的,核心原因有两点:
- 类型不匹配:
board1是int**类型,*board2是int*类型,直接赋值会触发编译警告甚至错误,属于非法类型转换。 - 逻辑完全错误:就算强行通过编译,这也只是把
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
相关产品推荐
相关产品推荐

