使用memcpy复制二维数组:能否为数组分配新内存实现独立复制?
嘿,这个问题我来给你掰扯清楚~
首先得明确一个关键点:memcpy本身不负责分配内存,它的核心功能只是把一段已存在的内存内容,原封不动地复制到另一段已经分配好的内存空间里。所以你说的“为数组分配新内存”并不是memcpy的活儿,但它绝对能帮你完成数组内容的复制,让两个数组实现完全独立的内存空间。
针对你举的例子:matrix1[13][15]和matrix2[13][15]都是静态定义的二维数组(也就是说它们的内存在程序运行前就已经分配好了),这时候用memcpy来实现复制非常高效,而且能保证两个数组完全独立。
具体实现方法
C语言里的静态二维数组在内存中是连续存储的——简单说就是matrix1其实是一块大小为13*15*sizeof(元素类型)的连续内存块。所以你可以直接一次性复制整个数组的内容:
#include <string.h> // 假设是int类型的二维数组,先初始化matrix1 int matrix1[13][15] = { /* 这里填你的初始化数据 */ }; int matrix2[13][15]; // 已经分配好内存的目标数组 // 一次性复制整个数组的所有内容 memcpy(matrix2, matrix1, sizeof(matrix1));
这里的sizeof(matrix1)会自动计算出整个二维数组的总字节数,memcpy会把matrix1起始地址开始的所有字节,完整复制到matrix2的起始地址里。这样操作后,两个数组的内容完全一致,而且各自占用独立的内存空间,修改其中任意一个数组的元素,都不会影响到另一个。
补充说明
如果是动态分配的二维数组(比如用指针数组int *matrix1[13]这种方式),那上面的方法就不适用了——因为指针数组里存的是指向每一行的指针,直接复制指针数组只会复制指针地址,导致两个数组共享同一块行内存。这时候需要先给目标数组的每一行分配独立内存,再逐行用memcpy复制内容。不过你的例子是静态二维数组,所以前面的方法完全够用。
另外要注意:使用这种方式复制的前提是,源数组和目标数组的类型、维度必须完全一致,这样sizeof计算的字节数才会匹配,避免出现内存越界或者复制不完整的问题。
内容的提问来源于stack exchange,提问作者arsalan ghasemian

