什么是分段故障?它在C和C++中不同吗?分段错误和悬挂指针是如何关联的?
当前回答
在计算中,分段故障或访问违规是由具有存储器保护的硬件引起的故障或故障状况,通知操作系统该软件已尝试访问内存的受限区域-维基百科
您可能正在使用错误的数据类型访问计算机内存。您的案例可能如下所示:
#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++中)
“分段错误”表示您试图访问无法访问的内存。
第一个问题是你的论点。main函数应该是int main(int argc,char*argv[]),在访问argv[1]之前,应该检查argc是否至少为2。
此外,由于要向printf传递一个浮点值(顺便说一句,在传递到printf时,它会转换为双精度),因此应该使用%f格式说明符。%s格式说明符用于字符串(以“\0”结尾的字符数组)。
在计算中,分段故障或访问违规是由具有存储器保护的硬件引起的故障或故障状况,通知操作系统该软件已尝试访问内存的受限区域-维基百科
您可能正在使用错误的数据类型访问计算机内存。您的案例可能如下所示:
#include <stdio.h>
int main(int argc, char *argv[]) {
char A = 'asd';
puts(A);
return 0;
}
“asd”->是一个字符链,而不是单个字符的char数据类型。因此,将其存储为字符会导致分段错误。在错误的位置存储一些数据。
将这个字符串或字符链存储为单个字符是为了在圆孔中插入一个方形钉。
由于信号:分段故障(11)而终止
塞格姆。错误与尝试在水下呼吸是一样的,你的肺不适合这样。为一个整数保留内存,然后尝试将其作为另一种数据类型进行操作,这根本不起作用。
分段故障也是由硬件故障引起的,在这种情况下是RAM存储器。这是不太常见的原因,但如果您在代码中没有发现错误,也许memtest可以帮助您。
在这种情况下,解决方案是更改RAM。
编辑:
这里有一个参考:硬件分割故障
当一个进程(正在运行的程序实例)试图访问另一个进程正在使用的只读内存地址或内存范围或访问不存在的内存地址时,会发生分段错误。
seg错误,当类型不匹配时