什么是分段故障?它在C和C++中不同吗?分段错误和悬挂指针是如何关联的?


当前回答

维基百科的Segmentation_fault页面对其进行了很好的描述,只是指出了原因和原因。查看wiki以获得详细描述。

在计算中,分段故障(通常简称为segfault)或访问违规是由具有内存保护的硬件引起的故障,通知操作系统(OS)内存访问违规。

以下是分段故障的一些典型原因:

取消引用NULL指针–这是内存管理硬件的特殊情况试图访问不存在的内存地址(在进程的地址空间之外)试图访问程序无权访问的内存(例如进程上下文中的内核结构)试图写入只读内存(如代码段)

这些通常由导致无效内存访问的编程错误引起:

取消引用或分配给未初始化的指针(指向随机内存地址的通配符指针)取消引用或分配给已释放指针(悬空指针,指向已释放/解除分配/删除的内存)缓冲区溢出。堆栈溢出。试图执行未正确编译的程序。(尽管存在编译时错误,某些编译器仍会输出可执行文件。)

其他回答

维基百科的Segmentation_fault页面对其进行了很好的描述,只是指出了原因和原因。查看wiki以获得详细描述。

在计算中,分段故障(通常简称为segfault)或访问违规是由具有内存保护的硬件引起的故障,通知操作系统(OS)内存访问违规。

以下是分段故障的一些典型原因:

取消引用NULL指针–这是内存管理硬件的特殊情况试图访问不存在的内存地址(在进程的地址空间之外)试图访问程序无权访问的内存(例如进程上下文中的内核结构)试图写入只读内存(如代码段)

这些通常由导致无效内存访问的编程错误引起:

取消引用或分配给未初始化的指针(指向随机内存地址的通配符指针)取消引用或分配给已释放指针(悬空指针,指向已释放/解除分配/删除的内存)缓冲区溢出。堆栈溢出。试图执行未正确编译的程序。(尽管存在编译时错误,某些编译器仍会输出可执行文件。)

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

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

答案中对“分段错误”有几个很好的解释,但由于分段错误通常会导致内存内容转储,所以我想分享分段错误(核心转储)中“核心转储”部分与内存之间的关系来源:

大约从1955年到1975年,在半导体存储器之前,计算机存储器中的主导技术使用了铜线上的微小磁性甜甜圈。甜甜圈被称为“铁氧体磁芯”,主存储器因此被称为核心存储器或“核心”。

从这里拍摄。

在计算中,分段故障或访问违规是由具有存储器保护的硬件引起的故障或故障状况,通知操作系统该软件已尝试访问内存的受限区域-维基百科

您可能正在使用错误的数据类型访问计算机内存。您的案例可能如下所示:

#include <stdio.h>

int main(int argc, char *argv[]) {
    
    char A = 'asd';
    puts(A);
    
    return 0;
    
}

“asd”->是一个字符链,而不是单个字符的char数据类型。因此,将其存储为字符会导致分段错误。在错误的位置存储一些数据。

将这个字符串或字符链存储为单个字符是为了在圆孔中插入一个方形钉。

由于信号:分段故障(11)而终止

塞格姆。错误与尝试在水下呼吸是一样的,你的肺不适合这样。为一个整数保留内存,然后尝试将其作为另一种数据类型进行操作,这根本不起作用。

老实说,正如其他海报所提到的那样,维基百科在这方面有一篇很好的文章,所以看看吧。这种类型的错误非常常见,通常称为其他错误,如访问违规或一般保护故障。

它们在C、C++或任何其他允许指针的语言中都没有区别。这些类型的错误通常由以下指针引起:

在正确初始化之前使用在它们指向的内存被重新定位或删除后使用。在索引超出数组边界的索引数组中使用。这通常只在对传统数组或c字符串进行指针计算时发生,而不是基于STL/Boost的集合(在c++中)