You need to enable JavaScript to run this app. CodeChef解题时int改为long long int触发SIGEMT运行时错误
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.03 09:45:04