PAT 段错误的原因和解决方法

目录

一.方法

二.原因

1.越界访问

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

3.sort函数使用错误


看到这篇文章的人,基本都是考浙大计院、软院、公院的考生,我曾经也考过,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;
}

这两种都是没问题的。


 

希望能对你们有帮助!

  • 30
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值