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

本文介绍了PAT中段错误的查找方法和可能原因。查找时可注释可疑代码提交到OJ判断。可能原因包括数组越界访问、大数组应开全局避免栈溢出、sort函数使用错误,如cmp规则不符或未正确返回值等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

一.查找方法

段错误⼀般是由数组越界、堆栈溢出(⽐如,递归调⽤层数太多)等情况引起。
查找的方法也比较简单,首先对可疑的代码注释掉,提交到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<b;

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

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

这两种都是没问题的。

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值