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

使用memcpy将数组复制到动态内存数组时,元素间为何出现三个零?

分析memcpy复制后数组内容异常的原因

嘿,这个问题我之前也碰到过类似的,大概率是这几个常见错误导致的,咱们一个个排查:

1. memcpy的长度参数传错了(最可能的原因)

memcpy的第三个参数要求的是要复制的字节数,而不是数组的元素个数!如果你直接传了n1(比如n1=5),那它只会复制5个字节,而不是5个int的总字节数。

举个例子,假设你的系统里int占4个字节:

  • 原数组a1的内存布局(小端模式下)是:01 00 00 00 02 00 00 00 03 00 00 00 ...
  • 当你只复制5字节时,mem1里的内容就是01 00 00 00 02
  • 后续访问mem1的其他元素时,读取的是未被复制的内存区域(通常是malloc分配的初始零值或垃圾值),就会出现你看到的1 0 0 0 2这种混乱结果。

2. 动态内存分配的大小不对

如果你的malloc调用只分配了sizeof(int)或者其他小于n1*sizeof(int)的大小,复制时就会发生缓冲区溢出,写入超出分配内存的区域,这属于未定义行为,会导致各种奇怪的输出,包括你遇到的情况。

比如错误的分配方式:

// 错误:只分配了1个int的内存,不是5个
int *mem1 = malloc(sizeof(int));

3. 指针变量mem1被意外修改

比如在memcpy前后,mem1的值被其他代码不小心修改了(比如误写了mem1++),导致后续访问的是偏移后的地址,看起来内容完全不对。

验证和修复方法

  • 修正memcpy的第三个参数:一定要写成n1 * sizeof(int),确保复制所有元素的总字节数。
  • 修正malloc的参数:同样用n1 * sizeof(int),保证分配足够的内存。
  • 检查指针是否被意外修改:可以在memcpy前后打印mem1的地址,确认指针值没有变化。
  • 加上malloc失败的检查,避免空指针操作:
    int *mem1 = malloc(n1 * sizeof(int));
    if (mem1 == NULL) {
        perror("malloc failed");
        return 1;
    }
    

正确代码示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    int a1[] = {1, 2, 3, 4, 5};
    int n1 = sizeof(a1) / sizeof(a1[0]); // 自动计算元素个数
    int *mem1 = malloc(n1 * sizeof(int));
    
    if (mem1 == NULL) {
        perror("malloc failed");
        return 1;
    }
    
    memcpy(mem1, a1, n1 * sizeof(int)); // 传递正确的字节数
    
    // 打印验证
    for (int i = 0; i < n1; i++) {
        printf("%d ", mem1[i]);
    }
    printf("\n");
    
    free(mem1); // 记得释放动态内存
    return 0;
}

运行这段代码会输出1 2 3 4 5,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:26:25