PAT中段错误的原因及解决方法

PAT中段错误的原因及解决方法

文章目录

    • PAT中段错误的原因及解决方法
      • 一.查找方法
      • 二.可能原因
        • 1.越界访问
        • 2.大数组一定要开全局,而不是写在main函数里面。
        • 3.sort函数使用错误

一.查找方法

段错误⼀般是由数组越界、堆栈溢出(⽐如,递归调⽤层数太多)等情况引起。
查找的方法也比较简单,首先对可疑的代码注释掉,提交到OJ上试试,如果确实是⾃⼰注释掉的 这段代码发⽣了段错误,那么对应的OJ判题结果就会变为答案错误⽽不再是段错误,说明注释 掉的代码正是引起越界溢出的原因所在。

二.可能原因

1.越界访问

数组开小了导致指针指向了为开辟的数组区域,出现了越界访问
多层 for 循环中内层循环本来打算写 j 或者 k ,却因为习惯或忘记误写成了外层循环的变 量 i 或 j ,导致数组访问 i 或 j 下标的时候发⽣了越界

2.大数组一定要开全局,而不是写在main函数里面。

因为⼤数组 在 main 函数⾥⾯的话是存储在栈⾥,⽽栈空间是在进程创建时初始化的,有固定的⼤⼩,⼀ 般为⼏⼗KB,所以太⼤的数组会耗光栈空间。⽽全局变量占⽤的堆空间,堆空间中的内存是按 需分配,⾃由增⻓的,可以⾮常⼤,⽐如32位的系统中可以⼤到4GB。将⼤数组放在全局变量中 能避免栈溢出~

3.sort函数使用错误

sort函数的cmp必须按照规则来写,即必须是>或者是<
比如

return a>b;
return a

而不能是>=或者<=否则可能出现段错误。
还有要注意的一点是:

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;
}

这两种都是没问题的。

部分内容来自柳神的博客,里面关于段错误有详细的解释。

你可能感兴趣的:(PAT)