CodeChef解题时int改为long long int触发SIGEMT运行时错误
代码问题排查结果
核心触发运行时错误的原因
- 数组定义顺序完全颠倒:循环内先写
long long int a[n];定义数组,之后才执行cin >> n;给n赋值。此时n是未初始化的栈随机值,拿这个垃圾值当数组长度本质是非法内存访问。之前用int类型时,随机值恰好偏小、数组没越界才碰巧能跑;换成long long后单个元素占8字节,同样的随机数组长度会占用双倍栈空间,直接触发栈溢出,报SIGEMT错误。 - 非法使用变长数组(VLA):
a[n]这种写法是GCC的非标准扩展,不属于C++标准语法,栈空间本身极小(通常只有几MB),数组长度稍大就会直接爆栈,没有任何安全性可言。
其他潜在问题
- 手动实现的
swap函数完全冗余:标准库已内置通用swap实现,自定义指针版本不仅没必要,还容易和标准库的重载规则冲突。 - 冒泡排序时间复杂度为O(n²),题目给出的n范围稍大就会直接超时,且本题根本不需要全量排序:目标函数的最大值等于数组最大值与最小值差值的2倍,遍历一次记录最大、最小值即可,时间复杂度O(n)。
- 类型不匹配的
abs调用:原abs函数默认处理int类型,传入long long值时会发生截断,应使用适配long long的std::abs版本。
修正后的可运行代码
#include <iostream> #include <vector> #include <cmath> #include <algorithm> using namespace std; int main() { long long k; cin >> k; while (k--) { long long n; cin >> n; // 先读入n,再动态分配数组空间,避免栈溢出 vector<long long> a(n); long long min_val = 1e18, max_val = -1e18; for (long long i = 0; i < n; i++) { cin >> a[i]; // 遍历时直接记录最大最小值,不需要排序 min_val = min(min_val, a[i]); max_val = max(max_val, a[i]); } cout << 2 * abs(max_val - min_val) << "\n"; } return 0; }
注:修正后的代码完全规避了变长数组、高复杂度排序的问题,同时适配long long的数值范围,不会触发运行时错误。
内容的提问来源于stack exchange,提问作者Priyanshu Saxena
相关产品推荐
相关产品推荐

