在我们日常编码中很可能遇到段错误,然而由于机器的错误码人类是不可能看懂的,也许我们遇到了此类错误而不知晓,导致无从下手进行修改。
那我们就来简单的看一下什么是段错误,我们怎么识别它。
所谓段错误,官方说明为:
“
A segmentation fault (often shortened to segfault) is a particular error condition that can occur during the operation of computer software. In short, a segmentation fault occurs when a program attempts to access a memory location that it is not allowed to access, or attempts to access a memory location in a way that is not allowed (e.g., attempts to write to a read-only location, or to overwrite part of the operating system). Systems based on processors like the Motorola 68000 tend to refer to these events as Address or Bus errors.
Segmentation is one approach to memory management and protection in the operating system. It has been superseded by paging for most purposes, but much of the terminology of segmentation is still used, "segmentation fault" being an example. Some operating systems still have segmentation at some logical level although paging is used as the main memory management policy.On Unix-like operating systems, a process that accesses invalid memory receives the SIGSEGV signal. On Microsoft Windows, a process that accesses invalid memory receives the STATUS_ACCESS_VIOLATION exception.
”
简言之就是访问了不该访问的内存。那么访问了不该访问的内存为什么叫段错误呢?这里涉及到一段内存管理的历史,我们一起看一下(注1):
1、一开始,人们根据直觉,将一个程序作为一整段进行管理,从而形成了纯粹分段(固定加载地址、固定分区、非固定分区、交换)管理模式,也称为基本内存管理模式,这种模式由于直观易实现,曾经大为流行。
2、但是,纯粹分段存在重大缺陷(由于此种模式下一个程序只有一段,从而导致内存空间增长困难,外部碎片、程序不能超过物理内存容量、一个程序必须同时加载到内存才能执行等缺点),为了克服这些缺点,引入了页式内存管理模式。
3、显然,页式内存管理克服了纯粹分段的一系列缺点,但又存在共享不方便、一个程序只能在一个徐地址空间增长的问题,为了解决这个问题,引入了逻辑分段。逻辑分段将一个程序按逻辑关系分解为多个段,从而扩大了程序可以使用的虚拟地址空间并解决了共享难的问题。
4、但是,逻辑分段终究还是分段,自然又引入了分段的缺点。而要客服这些缺点,自然又想到了分页。这样,人们又引入了段页式管理模式。
因此,内存管理模式经历了从纯粹分段到分页,再到逻辑分段,再到段内分页的演变过程,如下图所示:
所以正如官方说明所说段错误是与内存管理相关的错误。我们看一下段错误常年的几种类型,以便我们在平时的编码过程中避免犯这样的错误:
第一种:访问不存在的内存地址
第二种:访问系统保护的内存地址
第三种:访问只读的内存地址
第四种:栈溢出
我们来看一个例子:
运行结果:
可以看到,段错误是运行时产生的,返回的这一长串数“3221225477”是什么?这个就是官方说明中:
“
On Microsoft Windows, a process that accesses invalid memory receives the STATUS_ACCESS_VIOLATIONexception.
”
STATUS_ACCESS_VIOLATION错误的错误码,16进制为:0xC0000005
好了,我们知道了段错误的本质,常见形式和错误码,相信以后再遇到段错误我们就能迅速定位,不会再为错误码疑惑了。
注1:摘自https://www.cnblogs.com/edisonchou/p/5115242.html
那我们就来简单的看一下什么是段错误,我们怎么识别它。
所谓段错误,官方说明为:
“
A segmentation fault (often shortened to segfault) is a particular error condition that can occur during the operation of computer software. In short, a segmentation fault occurs when a program attempts to access a memory location that it is not allowed to access, or attempts to access a memory location in a way that is not allowed (e.g., attempts to write to a read-only location, or to overwrite part of the operating system). Systems based on processors like the Motorola 68000 tend to refer to these events as Address or Bus errors.
Segmentation is one approach to memory management and protection in the operating system. It has been superseded by paging for most purposes, but much of the terminology of segmentation is still used, "segmentation fault" being an example. Some operating systems still have segmentation at some logical level although paging is used as the main memory management policy.On Unix-like operating systems, a process that accesses invalid memory receives the SIGSEGV signal. On Microsoft Windows, a process that accesses invalid memory receives the STATUS_ACCESS_VIOLATION exception.
”
简言之就是访问了不该访问的内存。那么访问了不该访问的内存为什么叫段错误呢?这里涉及到一段内存管理的历史,我们一起看一下(注1):
1、一开始,人们根据直觉,将一个程序作为一整段进行管理,从而形成了纯粹分段(固定加载地址、固定分区、非固定分区、交换)管理模式,也称为基本内存管理模式,这种模式由于直观易实现,曾经大为流行。
2、但是,纯粹分段存在重大缺陷(由于此种模式下一个程序只有一段,从而导致内存空间增长困难,外部碎片、程序不能超过物理内存容量、一个程序必须同时加载到内存才能执行等缺点),为了克服这些缺点,引入了页式内存管理模式。
3、显然,页式内存管理克服了纯粹分段的一系列缺点,但又存在共享不方便、一个程序只能在一个徐地址空间增长的问题,为了解决这个问题,引入了逻辑分段。逻辑分段将一个程序按逻辑关系分解为多个段,从而扩大了程序可以使用的虚拟地址空间并解决了共享难的问题。
4、但是,逻辑分段终究还是分段,自然又引入了分段的缺点。而要客服这些缺点,自然又想到了分页。这样,人们又引入了段页式管理模式。
因此,内存管理模式经历了从纯粹分段到分页,再到逻辑分段,再到段内分页的演变过程,如下图所示:
所以正如官方说明所说段错误是与内存管理相关的错误。我们看一下段错误常年的几种类型,以便我们在平时的编码过程中避免犯这样的错误:
第一种:访问不存在的内存地址
第二种:访问系统保护的内存地址
第三种:访问只读的内存地址
第四种:栈溢出
我们来看一个例子:
运行结果:
可以看到,段错误是运行时产生的,返回的这一长串数“3221225477”是什么?这个就是官方说明中:
“
On Microsoft Windows, a process that accesses invalid memory receives the STATUS_ACCESS_VIOLATIONexception.
”
STATUS_ACCESS_VIOLATION错误的错误码,16进制为:0xC0000005
好了,我们知道了段错误的本质,常见形式和错误码,相信以后再遇到段错误我们就能迅速定位,不会再为错误码疑惑了。
注1:摘自https://www.cnblogs.com/edisonchou/p/5115242.html