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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:54:03