常见的死法

2018-06-25  本文已影响8人  小幸运Q

溢出(含段错误):

堆栈的大小为8192KB,在c/c++程序的函数中申请了过大的空间,或者递归层次太多,导致堆栈溢出了。
PS: 试试a[100]后面加个0

段错误是非常喜闻乐见的一种报错方式,因为段错误锁定问题代码区域的方式较为简单:首先对可疑的代码段进行注释掉,然后提交到OJ上看是否会发生段错误,如果确实是自己注释掉的这段代码发生了段错误,那么对应的OJ判题结果就会变为答案错误,说明注释掉的代码正是引起越界溢出的原因所在。

可能原因:
  1. 多层for循环中内层循环明明应该写j或者k,却写成了外层循环的变量i,导致数组访问i下标的时候发生了越界
  2. 数组开小了导致指针指向了未开辟的数组区域,出现了越界访问
  3. 大数组一定要开全局,而不是写在main函数里面,否则容易发生段错误
  4. 递归的出口写的有问题,递归层数太多导致了堆栈溢出,发生段错误
  5. int + int、int * int的过程中都有可能出现结果超过了int的值而产生溢出的情况,这样就会使一些数据较大的测试用例因为溢出变成了别的数字而得到答案错误(一般会变成负数)

Runtime Error:

你的程序在运行的时候出错了,异常终止了,导致这种状态的情况有肯多,一般都是一些非法操作,比如文件操作,Java中的网络操作等等。Java中Runtime Error的更详细的叙述见下。另外C/C++中越界访问函数中定义的数组也会导致Runtime Error。

可能的原因:
  1. 明明i从s.length()-1开始向前遍历,结果i误写成了i++导致了无限循环
  2. while循环的边界判断有问题,使得无限循环
  3. 对数据进行排序的过程中,有很多数据是无效数据,如果对所有数据都排序可能会引起超时,所以可以考虑在放入数组之前就做一些条件判断剔除无用数据,然后再对数组进行排序
  4. ** 使用了v.size()-1等方式,如果v的size本身就是0,因为v.size()返回值是无符号整数,无符号整数的0-1得到的是无符号整数的最大值18446744073709551615而非-1,这可能会让int i循环时超时。

非逻辑问题:

1.空行问题?

2.大小写问题?

3.空格问题?

4.读题问题?

5.能用printf不用,用cout然后超时。

6.做乘法运算的时候会不会溢出?需不需要先 % / ÷ 一下如何接着计算?

  1. 题目数据需要过滤,但是你没过滤。

  2. 题目数据量很大,没有使用二分查找?

上一篇下一篇

猜你喜欢

热点阅读