为了账号安全,请及时绑定邮箱和手机立即绑定

什么是分段错误?

什么是分段错误?

C++ C
哔哔one 2019-05-29 15:54:53
什么是分段错误?什么是分段错误?C和C ++有什么不同吗?分段错误和悬空指针是如何相关的?
查看完整描述

4 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

分段错误是由访问“不属于您”的内存引起的一种特定错误。它是一种帮助机制,可以防止破坏内存并引入难以调试的内存错误。每当你得到一个段错误时,你就知道你正在做一些错误的内存 - 访问已经被释放的变量,写入内存的只读部分等。在大多数语言中,分段错误本质上是相同的,让你搞砸了在内存管理方面,C和C ++中的段错误没有主要区别。

有很多方法可以获得段错误,至少在C(++)等低级语言中。获取段错误的常用方法是取消引用空指针:

int *p = NULL;*p = 1;

当您尝试写入标记为只读的内存部分时,会发生另一个段错误:

char *str = "Foo"; // Compiler marks the constant string as read-only*str = 'b'; // Which means this is illegal and results in a segfault

悬空指针指向一个不再存在的东西,就像这里:

char *p = NULL;{
    char c;
    p = &c;}// Now p is dangling

指针p悬空,因为它指向c块结束后不再存在的字符变量。当你试图取消引用悬空指针(如*p='A')时,你可能会得到一个段错误。


查看完整回答
反对 回复 2019-05-29
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

值得注意的是,分段故障不是由直接访问另一个进程内存引起的(这是我有时听到的),因为它根本不可能。对于虚拟内存,每个进程都有自己的虚拟地址空间,并且无法使用任何指针值访问另一个进程。对此的例外可以是共享库,它们是相同的物理地址空间,映射到(可能)不同的虚拟地址和内核内存,甚至在每个进程中以相同的方式映射(以避免系统调用上的TLB刷新,我认为)。像shmat这样的东西;) - 这些是我所谓的'间接'访问。但是,可以检查它们通常位于远离过程代码的位置,我们通常能够访问它们(这就是它们存在的原因,

但是,如果以不正确的方式访问我们自己的(进程)内存(例如尝试写入不可写空间),则可能发生分段错误。但最常见的原因是访问虚拟地址空间中未映射到物理地址的部分。

所有这些都与虚拟内存系统有关。


查看完整回答
反对 回复 2019-05-29
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

分段错误是由对进程未在其描述符表中列出的页面的请求,或对其确实列出的页面的无效请求(例如,在只读页面上的写入请求)引起的。

悬空指针是一个指针,可能指向或可能不指向有效页面,但确实指向“意外”的内存段。


查看完整回答
反对 回复 2019-05-29
  • 4 回答
  • 0 关注
  • 1757 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信