递归实现分治找数组最大值的C代码运行时触发段错误求助
分治法找数组最大值的段错误问题修复
你的代码出现段错误和逻辑错误,核心问题有这几个:
位运算优先级错误:
int mid = L + (R - L) >> 1;里的右移运算符>>优先级低于加法+,实际计算成了(L + (R-L)) >>1,也就是直接对R做右移,导致mid值完全错误,递归的区间划分混乱,最终引发栈溢出(段错误)。正确写法要给(R-L)>>1加括号:int mid = L + ((R - L) >> 1);。多余的
if(mid>0)判断完全错误:这个判断会导致当mid为0时直接返回0,比如处理数组前两个元素时,根本不会递归计算左右最大值,直接返回错误结果,还会打乱递归收敛逻辑,加剧栈溢出问题。直接删掉这个判断和else分支即可。变量名与函数名冲突:main函数里的
int max和你定义的max函数同名,会干扰函数调用逻辑,把main里的变量改成其他名字,比如result。
修正后的代码:
#include <stdio.h> int process(int arr[], int L, int R); int max(int lm, int rm); int main() { int arr1[] = { 14, 5, 6, 3, 8, 5, 6, 4 }; int result = process(arr1, 0, (sizeof(arr1) / sizeof(arr1[0])) - 1); printf("%d", result); } int max(int lm, int rm) { return lm > rm ? lm : rm; } int process(int arr[], int L, int R) { if (L == R) { return arr[L]; } int mid = L + ((R - L) >> 1); int leftMax = process(arr, L, mid); int rightMax = process(arr, mid + 1, R); return max(leftMax, rightMax); }
这段代码运行后会正确输出数组最大值14,也不会再出现段错误。
内容的提问来源于stack exchange,提问作者user28867477
相关产品推荐
相关产品推荐

