冒泡排序代码本地编译器崩溃在线编译器正常,求问题排查与修复
问题原因及修复方案
核心问题分析
- 数组声明时机错误:定义
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
相关产品推荐
相关产品推荐

