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

