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

C++使用memcpy复制含字符数组的结构体时出现段错误如何解决

段错误原因排查与修复说明

根因分析

代码中memcpy的第一个参数传值错误:

  • memcpy第一个入参要求是目标内存的起始地址,你传入的&b是指针变量自身的栈内存地址,而不是你通过malloc申请的、用来存储结构体实例的堆内存地址。
  • malloc申请到的堆内存的起始地址存在指针变量b中,直接传b才是正确的目标地址。
  • 错误传参会导致你向栈上仅8字节(64位环境下)的指针变量空间,写入了至少12字节的结构体内容,不仅直接栈溢出,还把指针b的取值覆盖为了非法地址,后续访问b->name时自然触发段错误。

修复方案

仅修改memcpy调用的第一个参数即可:
将原代码行

memcpy(&b,&obj,sizeof(struct A));

修改为

memcpy(b, &obj, sizeof(struct A));

额外优化建议

  • malloc调用后需要判断返回值是否为NULL,避免内存申请失败后访问空指针。
  • 堆内存使用完毕后要调用free(b)释放,避免内存泄漏。
  • C++环境下不需要手动调用memcpy做结构体复制,直接用结构体赋值语法更安全:*b = obj;
  • 无C兼容需求的场景更推荐用new替代malloc:struct A *b = new A;,使用完调用delete b释放即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 02:00:01