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

C++代码编译通过但无法运行,请求技术帮助

程序直接退出无法执行的问题分析与修复

核心崩溃原因

  • 未初始化的变长数组:C++标准不支持int A[m];这类变长数组(VLA),且定义数组时m未被赋值,属于未初始化变量,会导致栈内存分配错误,程序启动后直接崩溃,连初始的cout输出都无法执行。
  • 循环未更新输入值:while(n!=0)循环内没有再次读取n,即便程序能走到循环逻辑,也会陷入无限循环(若初始n不为0)。
  • default分支无输出:default: "Invalid Choice";只是一个无效的字符串字面量,不会向控制台输出错误提示。

修复后的完整代码

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;

int count = 0; // 显式初始化全局计数变量
void insertionSort(int A[], int len){
    int value, key;
    for(int i=1;i<len;i++){
        value = A[i];
        key = i;
        while(key>0 && A[key-1]>value){
            count++;
            A[key] = A[key-1];
            key = key-1;
        }
        A[key] = value;
    }
}

int main()
{
    int n, m;
    int* A = nullptr; // 用指针实现动态数组
    srand(time(0)); // 设置随机数种子,每次运行生成不同随机数组

    cout<<"Enter your choice:-"<<endl;
    while(cin>>n && n!=0) // 读取输入同时判断是否为有效退出条件
    {
        switch(n)
        {
        case 1:
            // 释放之前的数组(若存在),避免内存泄漏
            if(A != nullptr){
                delete[] A;
                A = nullptr;
            }
            cout<<"Enter the number of elements in the array:-"<<endl;
            cin>>m;
            A = new int[m]; // 动态分配数组内存
            for(int i=0;i<m;i++){
                A[i] = rand()%100;
            }
            cout<<"Array created"<<endl;
            cout<<"Array is:-"<<endl;
            for(int i=0;i<m;i++){
                cout<<A[i]<<" ";
            }
            cout<<endl; // 换行优化输出格式
            break;

        case 2:
            if(A == nullptr){
                cout<<"Please create an array first (choice 1)!"<<endl;
                break;
            }
            cout<<"Array will be sorted in ascending order"<<endl;
            count = 0; // 每次排序前重置计数
            insertionSort(A, m);
            cout<<"New Array is:-"<<endl;
            for(int i=0;i<m;i++){
                cout<<A[i]<<" ";
            }
            cout<<endl;
            cout<<"Number of comparisons: "<<count<<endl;
            break;

        case 3:
            if(A == nullptr){
                cout<<"Please create an array first (choice 1)!"<<endl;
                break;
            }
            cout<<"Array will be sorted in descending order"<<endl;
            count = 0;
            insertionSort(A, m);
            // 修复降序逻辑:先保存排序后的数组,避免直接反转时覆盖元素
            int* temp = new int[m];
            for(int i=0;i<m;i++){
                temp[i] = A[i];
            }
            for(int i=0;i<m;i++){
                A[i] = temp[m-i-1];
            }
            delete[] temp;
            cout<<"New Array is:-"<<endl;
            for(int i=0;i<m;i++){
                cout<<A[i]<<" ";
            }
            cout<<endl;
            cout<<"Number of comparisons: "<<count<<endl;
            break;

        case 4:
            cout<<"Time Complexity for ascending is:-"<<endl;
            cout<<"O(n^2)"<<endl;
            break;

        case 5:
            cout<<"Time Complexity for descending is:-"<<endl;
            cout<<"O(n^2)"<<endl;
            break;
        default: 
            cout<<"Invalid Choice"<<endl;
            break;
        }
        cout<<"\nEnter your choice:-"<<endl; // 循环末尾提示再次输入
    }

    // 程序结束前释放动态分配的内存
    if(A != nullptr){
        delete[] A;
    }
    return 0;
}

额外优化说明

  • 用动态数组替代变长数组:通过new[]和delete[]在堆上分配内存,避免栈溢出和未定义行为。
  • 添加数组空指针检查:防止用户未创建数组就执行排序操作。
  • 修复降序排序逻辑:原代码直接反转会覆盖数组元素,新增临时数组保存排序结果后再反转。
  • 设置随机数种子:srand(time(0))让每次运行生成不同的随机数组。
  • 循环内重新提示输入:每次操作后再次引导用户输入选择,避免无限循环。
  • 显式初始化并重置计数变量:确保每次排序的比较计数准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 05:45:40