You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

冒泡排序代码本地编译器崩溃在线编译器正常,求问题排查与修复

问题原因及修复方案

核心问题分析

  • 数组声明时机错误:定义int numbers[n];时,变量n还未被赋值,此时n是未初始化的随机值,导致数组大小为不确定的垃圾值。后续输入n并向数组写入n个元素时,必然触发内存越界访问,直接导致程序崩溃。
  • 非标准变长数组(VLA):int numbers[n];是C99特性,并非标准C++语法。虽然部分编译器(如GCC)提供扩展支持,但不同编译器的处理逻辑存在差异,这也是本地与在线编译器表现不一致的原因之一。

修复方案

方案1:使用动态分配数组(new/delete)

先获取用户输入的n,再动态分配对应大小的内存,确保数组大小合法:

#include <iostream>
using namespace std;

int main()
{
    int n;
    cout << "How many numbers do you want to sort?\n";
    cin >> n;
    // 先输入n,再动态分配数组内存
    int* numbers = new int[n];
    
    cout << "Enter the "<< n <<" values.\n";
    for (int w = 0; w < n; w++)
    {
        cin >> numbers[w];
    }

    cout << "The unsorted list is: \n";
    for (int m = 0; m < n; m++)
    {
        cout << numbers[m] << "\t";
    }
    // 冒泡排序优化:内层循环终止位置随迭代次数减少,避免重复比较已排序元素
    for (int iterat = 0; iterat < n-1; iterat++)
    {
        for (int j = 0; j < n-1 - iterat; j++)
        {
            if (numbers[j] > numbers[j + 1])
            {
                int temp = numbers[j];
                numbers[j] = numbers[j + 1];
                numbers[j + 1] = temp;
            }
        }
    }

    cout << "\nThe sorted list is: \n";
    for (int p = 0; p < n; p++)
    {
        cout << numbers[p] << "\t";
    }
    
    // 释放动态分配的内存,避免内存泄漏
    delete[] numbers;
    return 0;
}

方案2:使用std::vector(推荐,更安全)

C标准库的vector容器会自动管理内存,无需手动分配/释放,是更符合C规范的写法:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int n;
    cout << "How many numbers do you want to sort?\n";
    cin >> n;
    // 初始化vector为n个int元素
    vector<int> numbers(n);
    
    cout << "Enter the "<< n <<" values.\n";
    for (int w = 0; w < n; w++)
    {
        cin >> numbers[w];
    }

    cout << "The unsorted list is: \n";
    for (int m = 0; m < n; m++)
    {
        cout << numbers[m] << "\t";
    }
    for (int iterat = 0; iterat < n-1; iterat++)
    {
        for (int j = 0; j < n-1 - iterat; j++)
        {
            if (numbers[j] > numbers[j + 1])
            {
                int temp = numbers[j];
                numbers[j] = numbers[j + 1];
                numbers[j + 1] = temp;
            }
        }
    }

    cout << "\nThe sorted list is: \n";
    for (int p = 0; p < n; p++)
    {
        cout << numbers[p] << "\t";
    }
    
    return 0;
}

额外注意点

原代码中的换行符 是无效写法,需改为标准的\n,否则编译器会报错,这应该是你粘贴代码时的转义字符丢失问题。

内容的提问来源于stack exchange,提问作者Tiffany

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:35:21