C++ Codeforces代码未读取输入就终止运行的问题排查
问题根因
- 栈空间溢出是程序未读取输入就直接终止的核心原因:你将三个大小为
1e7+5的int数组seive、sum、count声明为main函数内的局部变量,存储在进程栈区。按每个int占4字节计算,三个数组总占用内存约120MB,远大于操作系统默认的1~8MB栈空间上限,程序进入main函数时分配栈空间失败直接触发崩溃,还未执行到输入读取逻辑就终止运行。
修复方法
- 将三个大数组移到全局作用域:全局变量存储在进程静态存储区,不受栈空间限制,只要系统内存充足即可正常分配。
- 也可以改用
vector<int>声明三个数组,vector的底层数据存储在堆区,同样不会占用栈空间。
其他需要修正的逻辑错误
memset(seive,1,sizeof(seive))的写法不符合预期:memset是按字节赋值,int类型占4字节时,每个seive元素最终会被赋值为0x01010101(十进制16843009),后续判断seive[i]==1的条件永远不会成立。你可以将seive改为bool类型数组(单个元素占1字节),或者改用循环给数组元素赋值为1。- 查询逻辑中缺少
l、r的输入语句:while(m--)分支内只声明了int l,r,没有写cin >> l >> r的输入逻辑,修复栈溢出问题后需要补充该代码。 - 代码中的
int arr[n]是C风格变长数组,不属于标准C++语法,部分编译器不支持该写法,建议替换为vector<int> arr(n)。 - 边界判断存在越界风险:当
l=1时,sum[l-1]会访问sum[0],你的代码中只从i=2开始更新sum数组,需要补充sum[0]、sum[1]的初始值处理。
内容的提问来源于stack exchange,提问作者user7186002
相关产品推荐
相关产品推荐

