目录
看到这篇文章的人,基本都是考浙大计院、软院、公院的考生,我曾经也考过,2020年春季pat甲级90分,但是最终没有考上浙大,希望这篇文章对你们有帮助,同时也希望你们加油,选择大于努力。
一.方法
一般情况下,段错误是由数组越界、堆栈溢出(⽐如,递归调⽤层数太多)等情况引起。
查找的方法也比较简单,首先对可疑的代码注释掉,提交到OJ上试试,如果确实是⾃⼰注释掉的 这段代码发⽣了段错误,那么对应的OJ判题结果就会变为答案错误⽽不再是段错误,说明注释 掉的代码正是引起越界溢出的原因所在。
二.原因
1.越界访问
数组开小了导致指针指向了为开辟的数组区域,出现了越界访问
多层 for 循环中内层循环本来打算写 j 或者 k ,却因为习惯或忘记误写成了外层循环的变 量 i 或 j ,导致数组访问 i 或 j 下标的时候发⽣了越界
比如题上说40000,你开了10000,也会报错。
2.大数组一定要开全局,而不是写在main函数里面。
因为⼤数组 在 main 函数⾥⾯的话是存储在栈⾥,⽽栈空间是在进程创建时初始化的,有固定的⼤⼩,⼀ 般为⼏⼗KB,所以太⼤的数组会耗光栈空间。⽽全局变量占⽤的堆空间,堆空间中的内存是按 需分配,⾃由增⻓的,可以⾮常⼤,⽐如32位的系统中可以⼤到4GB。将⼤数组放在全局变量中 能避免栈溢出
3.sort函数使用错误
sort函数的cmp必须按照规则来写,即必须是>或者是<
而不能是>=或者<=否则可能出现段错误。
还有要注意的一点是:(这点我曾经被坑过)
bool cmp(student a,student b)
{
if(a.grade[3]!=b.grade[3])
return a.grade[3]>b.grade[3];
}
这种写法也会出现段错误,因为当(a.grade[3]==b.grade[3])时并没有return一个值,所以会导致错误,正确的写法:
bool cmp(student a,student b)
{
return a.grade[3]>b.grade[3];
}
bool cmp(Student a,Student b)
{
if(a.score!=b.score)
return a.score>b.score;
else return strcmp(a.id,b.id)<0;
}
这两种都是没问题的。
希望能对你们有帮助!