什么是分段故障?它在C和C++中不同吗?分段错误和悬挂指针是如何关联的?
当前回答
当程序试图访问不存在的内存位置,或试图以不允许的方式访问内存位置时,会发生分段错误或访问冲突。
/* "Array out of bounds" error
valid indices for array foo
are 0, 1, ... 999 */
int foo[1000];
for (int i = 0; i <= 1000 ; i++)
foo[i] = i;
这里i[1000]不存在,因此出现segfault。
分段故障的原因:
it arise primarily due to errors in use of pointers for virtual memory addressing, particularly illegal access.
De-referencing NULL pointers – this is special-cased by memory management hardware.
Attempting to access a nonexistent memory address (outside process’s address space).
Attempting to access memory the program does not have rights to (such as kernel structures in process context).
Attempting to write read-only memory (such as code segment).
其他回答
分段故障也是由硬件故障引起的,在这种情况下是RAM存储器。这是不太常见的原因,但如果您在代码中没有发现错误,也许memtest可以帮助您。
在这种情况下,解决方案是更改RAM。
编辑:
这里有一个参考:硬件分割故障
老实说,正如其他海报所提到的那样,维基百科在这方面有一篇很好的文章,所以看看吧。这种类型的错误非常常见,通常称为其他错误,如访问违规或一般保护故障。
它们在C、C++或任何其他允许指针的语言中都没有区别。这些类型的错误通常由以下指针引起:
在正确初始化之前使用在它们指向的内存被重新定位或删除后使用。在索引超出数组边界的索引数组中使用。这通常只在对传统数组或c字符串进行指针计算时发生,而不是基于STL/Boost的集合(在c++中)
在计算中,分段故障或访问违规是由具有存储器保护的硬件引起的故障或故障状况,通知操作系统该软件已尝试访问内存的受限区域-维基百科
您可能正在使用错误的数据类型访问计算机内存。您的案例可能如下所示:
#include <stdio.h>
int main(int argc, char *argv[]) {
char A = 'asd';
puts(A);
return 0;
}
“asd”->是一个字符链,而不是单个字符的char数据类型。因此,将其存储为字符会导致分段错误。在错误的位置存储一些数据。
将这个字符串或字符链存储为单个字符是为了在圆孔中插入一个方形钉。
由于信号:分段故障(11)而终止
塞格姆。错误与尝试在水下呼吸是一样的,你的肺不适合这样。为一个整数保留内存,然后尝试将其作为另一种数据类型进行操作,这根本不起作用。
考虑以下代码片段,
代码段1
int *number = NULL;
*number = 1;
代码段2
int *number = malloc(sizeof(int));
*number = 1;
如果你问这个问题,我假设你知道函数的含义:malloc()和sizeof()。
既然已经解决了,SNIPET 1将引发分段错误。而SNIPET 2则不会。
原因如下。
代码段1的第一行是创建一个变量(*number)来存储其他变量的地址,但在本例中,它被初始化为NULL。另一方面片段二的第二行是创建相同的变量(*number)来存储另一个的地址,在这种情况下,它被赋予了一个内存地址(因为malloc()是C/C++中的一个函数,它返回计算机的内存地址)
关键是你不能把水放在一个没有买过的碗里,或者一个已经买过但没有授权使用的碗里。当您尝试这样做时,计算机会发出警报,并抛出SegFault错误。
您应该只使用接近低级的语言(如C/C++)来面对这些错误。其他高级语言中有一个抽象,可以确保您不会犯此错误。
同样重要的是要理解分段错误不是特定于语言的。
根据维基百科:
当程序试图访问内存不允许的位置访问或尝试访问内存以不允许的方式定位(例如,尝试写入只读位置,或覆盖操作系统的一部分)。
推荐文章
- 什么是“参数依赖查找”(又名ADL,或“Koenig查找”)?
- 公共朋友交换成员函数
- 如何将文件指针(file * fp)转换为文件描述符(int fd)?
- 如何在Go中使用c++
- 自定义c++分配器的引人注目的例子?
- RAII和c++中的智能指针
- 如何构建和使用谷歌TensorFlow c++ api
- C“int”的大小是2字节还是4字节?
- 多维数组如何在内存中格式化?
- printf()和puts()在C语言中的区别是什么?
- 断言是邪恶的吗?
- 下面这些短语在c++中是什么意思:0 -,default-和value-initialization?
- 在STL地图中,使用map::insert比[]更好吗?
- C++ Linux的想法?
- 有效,但毫无价值的语法在开关情况下?