求排查快速排序代码中的段错误(SIGSEGV)问题
排查快速排序的段错误(SIGSEGV)问题
你的代码出现段错误的核心原因是递归调用时的区间范围错误,导致无限递归引发栈溢出,我来一步步拆解问题:
1. 递归调用的致命错误
看你的quick_sort函数里的递归部分:
quick_sort(arr,start,pindex); quick_sort(arr,pindex,end);
在partition函数执行完毕后,pindex位置的元素已经是最终排好序的基准值,不需要再参与后续的递归排序。但你第二个递归调用的起始参数是pindex,这会导致递归处理的区间始终包含这个基准值,形成无限递归——每次递归的区间都无法缩小到start >= end的终止条件,最终栈内存耗尽,触发SIGSEGV段错误。
正确的递归调用应该是:
quick_sort(arr, start, pindex); quick_sort(arr, pindex + 1, end);
第二个递归从pindex + 1开始,跳过已经排好的基准值,保证每次递归的区间都在缩小。
2. 次要问题:拼写错误
你的partition函数里把pivot拼成了piviot,虽然这不会导致运行错误,但属于代码风格问题,建议修正以提升可读性。
修正后的完整代码
void swap(int* a,int* b) { int temp=*a; *a=*b; *b=temp; } int partition (int arr[],int start,int end) { int pivot=arr[end-1]; // 修正拼写 int pindex=start; for(int i=start;i<end-1;i++) { if(arr[i]<=pivot) { swap(&arr[i],&arr[pindex++]); } } swap(&arr[end-1],&arr[pindex]); return pindex; } void quick_sort(int arr[],int start,int end) { if(start<end) { int pindex=partition(arr,start,end); quick_sort(arr,start,pindex); quick_sort(arr,pindex+1,end); // 修正递归起始点 } }
验证逻辑
修正后,每次递归的区间都会正确缩小:
- 左递归处理
[start, pindex)区间(你的quick_sort采用左闭右开的区间定义,end是区间的右边界,不包含在内) - 右递归处理
[pindex+1, end)区间
这样基准值所在的pindex位置不会被重复处理,递归会正常终止,不会出现栈溢出。
内容的提问来源于stack exchange,提问作者vishal gupta




