为何这两行代码会触发SEGV错误?可能存在什么问题?
触发SEGV错误的常见原因(针对更新person成员变量场景)
你当前触发的是段错误,本质是访问了进程无权修改的非法内存,结合你更新person变量的场景,常见原因如下:
person是空指针/野指针:这是该类场景最高发的原因。如果你仅声明了Person *person指针但没有通过new/malloc为其分配实际内存,或是指针指向的内存已经提前调用delete/free释放,或是指针未初始化指向随机内存,这时候执行person->xxx = xxx修改成员变量的操作就会直接触发SEGV。- 数组下标越界:如果你是通过数组下标访问person实例,比如
person[5].xxx = xxx,下标超过了数组实际的长度,访问到了进程未申请的内存区域,修改时就会触发段错误。 - 尝试修改只读内存:如果
person指针指向了常量区等只读内存段,比如把全局常量结构体的地址赋值给person后尝试修改其成员,也会触发SEGV。 - 栈溢出:如果
person是栈上分配的超大结构体,或是修改成员时误覆盖了栈上的返回地址等关键内存,也会触发段错误。
快速排查方法:用gdb运行程序,崩溃后执行bt命令查看调用栈定位到报错代码行,再执行p person打印指针地址,确认是否为0x0或非法地址,即可快速定位根因。
内容的提问来源于stack exchange,提问作者Hasseeb Qutabzada
相关产品推荐
相关产品推荐

