C语言二分查找代码出现Segmentation Fault问题求助
二分查找代码段错误问题排查
你的代码出现Segmentation Fault的核心原因有两个:
mid索引计算错误
你当前的mid = (end - start) / 2只计算了区间的偏移量,不是数组的实际索引。比如当递归进入start=5, end=9的区间时,mid会被算成2,这时候访问arr[2]完全不在当前要查找的范围内,直接导致逻辑混乱,触发无限递归,最终栈溢出引发段错误。
正确的mid计算应该是mid = start + (end - start) / 2(或者(start + end) / 2,前者能避免start+end溢出的情况)。缺少递归终止条件
当start > end时,说明目标元素不在数组中,应该直接返回-1。如果没有这个判断,即使区间已经无效,代码仍会尝试访问arr[mid],可能导致越界访问,或者继续无意义的递归。
修正后的代码如下:
#include <stdio.h> int binary(int arr[], int start, int end, int target) { // 先判断区间是否有效,无效直接返回-1 if (start > end) { return -1; } // 正确计算mid索引 int mid = start + (end - start) / 2; if (arr[mid] == target) { return mid; } if (arr[mid] < target) { return binary(arr, mid + 1, end, target); } else { return binary(arr, start, mid - 1, target); } } int main(void) { int arr[10] = {1, 2, 5, 10, 17, 26, 37, 50, 65, 82}; int num, location; scanf("%i", &num); location = binary(arr, 0, 9, num); printf("%i", location); return 0; }
另外补充一点:你原来代码里的if (mid < end)和if (mid > start)判断可以去掉,因为我们已经提前判断了start > end的终止条件,递归调用时的区间会自然收敛,不会出现无效的递归调用。
内容的提问来源于stack exchange,提问作者t0my0ung
相关产品推荐
相关产品推荐

