C语言使用memcpy复制二维数组异常的原因及解决方案咨询
问题原因分析
memcpy函数的第三个参数代表的是需要复制的内存字节数,而非数组元素个数或者行数,你两次写法出错的核心原因都是参数传错:
- 第一次整体复制的写法里,你传入的参数是
3,仅会复制3个字节的内容。而常见系统中int类型占4字节,整个3×3的int数组总大小为3 * 3 * sizeof(int) = 36字节,仅复制3字节完全不足以覆盖整个数组,剩下未复制的区域都是栈内存的原始垃圾值,所以输出会出现乱码。 - 后续逐行复制的写法同样是参数错误,每行3个int的总大小是
3 * sizeof(int)字节,你依然传了3,仅复制了每行前3个字节的内容,同样无法得到正确的复制结果。
修正方案
有两种常用的正确写法可以实现需求:
方案1:一次性复制整个数组
直接传入整个数组的总字节数即可:
// 写法1:直接用sizeof拿到整个数组的大小,适用于栈上分配的固定大小数组 memcpy(arr_copy, arr, sizeof(arr)); // 写法2:显式计算总大小,可读性更强 memcpy(arr_copy, arr, 3 * 3 * sizeof(int));
方案2:逐行复制
修改每行复制的字节数为单行数组的总大小即可:
for (int i = 0; i < 3; ++i) // 写法1:用sizeof拿到单行数组的大小 memcpy(arr_copy[i], arr[i], sizeof(arr[i])); // 写法2:显式计算单行大小 // memcpy(arr_copy[i], arr[i], 3 * sizeof(int));
修改完成后重新运行代码,arr_copy的输出就会和原数组完全一致。
内容的提问来源于stack exchange,提问作者Elgin Cahangirov
相关产品推荐
相关产品推荐

