C++用户自定义数组冒泡排序运行触发段错误的问题排查
代码段错误原因说明
你给出的冒泡排序代码触发段错误的原因如下:
#include<iostream> using namespace std; int main(){ int arr[40]; int n; cout<<"Enter the size of array: \n"; cin>>n; for(int i=0;i<n;i++){ cin>>arr[i]; } for(int i=0;i<n;i++){ cout<<"Entered value for array before sorting is "<<arr[i]<<"\t"; } int counter = 1; while(counter < n){ // 错误就出在这一行的for循环条件 for (int i=0;counter<n;i++){ if(arr[i]>arr[i+1]){ int temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; } } counter++; } for(int i=0;i<n;i++){ cout<<"sorted array is "<<arr[i]<<"\t"; } }
- 核心触发原因:内层
for循环的终止条件写错。你把判断条件写为counter<n,这个值在单次内层循环执行过程中是固定不变的,会导致i无限自增,很快就超出数组的合法访问范围,访问非法内存直接触发段错误。
正确的内层循环终止条件应该判断i的边界,不做优化的基础写法是i < n - 1,避免i+1越界;如果要优化减少重复比较,可以写为i < n - counter,每一轮冒泡都会把当前未排序部分的最大值放到末尾,不需要再比较已经排好的尾部元素。 - 潜在风险:数组定义为固定长度40,若用户输入的
n大于40,输入元素时就会越界写入数组,也会触发段错误。建议改用C++的vector<int>动态存储元素,或者在读取n后先判断n <= 40再执行后续逻辑。
修正后的可运行代码示例
#include<iostream> #include<vector> using namespace std; int main(){ int n; cout<<"Enter the size of array: \n"; cin>>n; // 改用动态vector避免定长数组越界 vector<int> arr(n); for(int i=0;i<n;i++){ cin>>arr[i]; } cout<<"\nEntered value for array before sorting is: "; for(int i=0;i<n;i++){ cout<<arr[i]<<"\t"; } int counter = 1; while(counter < n){ // 修正内层循环条件 for (int i=0;i < n - counter;i++){ if(arr[i]>arr[i+1]){ int temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; } } counter++; } cout<<"\nsorted array is: "; for(int i=0;i<n;i++){ cout<<arr[i]<<"\t"; } return 0; }
内容的提问来源于stack exchange,提问作者Madhva
相关产品推荐
相关产品推荐

