使用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
相关产品推荐
相关产品推荐

