如何将静态数组复制到动态分配内存?示例中b为何未存储1.、2.?
问题原因
你的代码错误出在memcpy的第三个参数传值不正确:memcpy的第三个参数代表需要复制的内存总字节数,而你只传了LEN=2,仅会复制2个字节的内容。常见64位平台下单个double类型就占8字节,整个a数组总大小是2*8=16字节,仅复制前2字节完全不足以存储完整的double数值,剩下的内存区域是malloc申请的未初始化脏数据,所以输出结果不符合预期。
修复方案
把memcpy调用行修改为以下任意一种即可:
// 方式1:乘以单个double类型的大小,得到总字节数 memcpy(b, a, LEN * sizeof(double)); // 方式2:用指针指向的类型计算大小,扩展性更好 memcpy(b, a, LEN * sizeof(*a)); memcpy(b, a, LEN * sizeof(*b));
额外优化建议
- 标准C规范中
main函数的返回值应为int,而非void,建议修改为int main()并在末尾添加return 0; malloc申请内存后需要判空,避免申请失败导致空指针访问- 动态申请的内存使用完后需要调用
free(b)释放,避免内存泄漏
修复后完整代码
#include <string.h> #include <stdlib.h> #include <stdio.h> #define LEN 2 int main() { double a[LEN] = {1, 2}; double* b = malloc(LEN * sizeof(*b)); if (b == NULL) { perror("malloc failed"); return 1; } memcpy(b, a, LEN * sizeof(*b)); for (size_t i = 0; i < LEN; i++) { printf("%.2f ", b[i]); } printf("\n"); free(b); return 0; }
运行后输出结果为:
1.00 2.00
内容的提问来源于stack exchange,提问作者fhchl
相关产品推荐
相关产品推荐

