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
相关产品推荐
相关产品推荐

