c++ linux Segmentation fault报错记录

本文详细解释了Segmentation fault(段错误)的原因及机制,包括访问非法内存区域或以错误方式访问合法内存区域的情况,并介绍了SIGSEGV信号的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c++ linux Segmentation fault报错记录

什么是Segmentation fault?

segmentation,分割,分段,segmentation fault就是段错误的意思。所谓的段错误就是指访问的内存超过了所给这个程序的内存空间,通常这个值是由gdtr来保存的,它是一个48位寄存器,其中的32位是保存由它指向的gdt表,后13位保存相应于gdt的下表,最后3位包括了程序是否在内存中以及程序的cpu中的运行级别,指向的gdt是由64位为一个单位的表,在这张表中就保存着程序运行的代码段、数据段的起始地址、相应的断限和页面交换还有程序运行级别和内存粒度等信息,一旦一个程序发生了越界访问,CPU就会产生相应的异常保护,于是segmentation fault就出现了。

即当程序试图访问不被允许访问的内存区域(比如,尝试写一块属于操作系统的内存),或以错误的类型访问内存区域(比如,尝试写一块只读内存)。这个描述是准确的。为了加深理解,我们再更详细的概括一下SIGSEGV。段错误应该就是访问了不可访问的内存,这个内存要么是不存在的,要么是受系统保护的

SIGSEGV:SIG是信号名称的一般前缀,SEGV是segmentation violation(分段违规),这是一个内存段错误。可以理解为发生segmentation fault的时候就会发出信号SIGSEGV

  • SIGSEGV是在访问内存时发生的错误,它属于内存管理的范畴
  • SIGSEGV是一个用户态的概念,是操作系统在用户态程序错误访问内存时所做的处理
  • 当用户态程序访问(访问表示读、写或执行)不允许访问的内存时,产生SIGSEGV
  • 当用户态程序以错误的方式访问允许访问的内存时,产生SIGSEGV

用户态程序地址空间,特指程序可以访问的地址空间范围。如果广义的说,一个进程的地址空间应该包括内核空间部分,只是它不能访问而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值