相关文章推荐
独立的冲锋衣  ·  [复选框] ...·  8 月前    · 
机灵的木耳  ·  java sql盲注 ...·  1 年前    · 

PAT 刷题之段错误【updating…】

1.什么是段错误?

先给出一张图,所谓的段错误就是: Segmentation fault
在这里插入图片描述
在提交 pat 的一道题时,出现了这个段错误。其实更具体的报错是:

Program received signal SIGSEGV,Segmentation fault.

我尝试使用其它的测试用例调试时,发现的确存在这个问题,如下:
在这里插入图片描述

2.如何解决?

是程序存在漏洞,导致出现这个问题。常见的漏洞就是:

  • 访问了不该访问的内容,导致出现这种错误。
============= update on 2019 01 21 ============

今天在刷pat题时,又出现了段错误。题目如下:
PAT 1117:题目
链接
这道题很简单

3.1 代码如下:
#include<cstdio>
using namespace std;
int main(){
	int n ;
	scanf("%d",&n);
	int array[n+1];
	int i = 0;
	int dis;
	for(i = 0;i<= n;i++){
		array[i] = 0;
	for(i = 0;i< n ;i++){
		scanf("%d",&dis);
		while(--dis>0 ){
			array[dis]++;
	for(i = n;i >= 1;i--){
		if(array[i] == i){
			printf("%d",array[i]);
			break;	
3.2 测试用例
9 9 9

使用上述的测试用例时,出现的情况如下:
在这里插入图片描述
即:输入数据之后,莫名卡住。而这个莫名卡住,就是因为访问了不应该访问的内存。这种问题极易出现在数组下标越界等情况。因为C++语言是没有ArrayIndexOutOfBoundsException 报的。所以只能报一个较为低级的段错误

3.3 提交代码
3.4 修改错误

针对题目的叙述,我检查了一下问题的原因。主要是因为array[]数组下标越界的情况导致。所以这里将 代码

while(--dis>0 ){
	array[dis]++;
while(--dis>0 ){
	if( dis<=n )	array[dis]++;

这样就可以避免导致 段错误 的出现了。

==== update on 2019 02 01 ===========

今天在刷题的时候,再次遇到了段错误。如下图所示:
在这里插入图片描述
这一题是1130,求出一个二叉树的中序遍历。【但要求是:需要输出括号】 这里不再介绍。发生段错误的原因是:
因为leftRootrightRoot值可能为-1,但是array[]没有-1的下标。当访问array[-1]于是就产生了段错误。修改一下代码如下:

if(leftRoot != -1) ldr(leftRoot);
	cout<<n[root].data;
if(rightRoot !=-1) ldr(rightRoot);
                    PAT刷题之段错误【updating…】1.什么是段错误?先给出一张图,所谓的段错误就是:Segmentation fault在提交 pat 的一道题时,出现了这个段错误。其实更具体的报错是:Program received signal SIGSEGV,Segmentation fault.我尝试使用不同的测试用例调试时,发现的确存在这个问题,如下:2.如何解决?可能是程序...
				
PAT段错误的原因及解决方法 文章目录PAT段错误的原因及解决方法一.查找方法二.可能原因1.越界访问2.大数组一定要开全局,而不是写在main函数里面。3.sort函数使用错误 一.查找方法 段错误⼀般是由数组越界、堆栈溢出(⽐如,递归调⽤层数太多)等情况引起。 查找的方法也比较简单,首先对可疑的代码注释掉,提交到OJ上试试,如果确实是⾃⼰注释掉的 这段代码发⽣了段错误,那么对应的OJ判题结...
数组越界应该是最常见的段错误了,一般在定义数组的时候大小可能有所偏差,注意题目中的数组范围即可。 在写递归的时候,可能会出现递归调用层数太多导致堆栈溢出,可以将大数组作为全局变量,可以开到很大避免溢出。 变量未初始化 这是我在做题的时候偶然发现的,题目对数组大小限制不大,又没有用到递归,找了半天试着把几个变量初始化后发现错误没了,具体原因不知道,可能是变量随机分配到给定的内存空间外 ? 检查一下数组大小是不是少写了个0(笔者以前就有过…),如果题目要求1000,建议写1010 检查循环遍历的过程中,是否有个别下标越界的情况。 sort函数里cmp比较函数必须要有返回值,比如只有一个return,不要在前面再写个if语句画蛇添足了 如果数组比较大,一般来说>10000就算大,就请在main的外面...
今天调试代码的时候,遇到一个问题就是出现了“段错误”。出现“段错误”的原因就是:访问的内存超出了系统给这个程序所设定的内存空间。知道原因是一个很好的开始,但是并不代表就很容易解决,特别是在代码量较大的情况下,如何才能定位到出错的地方?接下来,我就大概讲一下自己的一点经验,如何在Linux C中用几个命令搞定“段错误”。 1、dmesg 通过dmesg命令可以查看发生段错误的程序名称、引起段错误