为何传递数组给函数后值异常改变?求原因与修复方案
问题原因与修复方案
核心错误分析
- 数组声明错误:main函数里
int arr = {1,2,3,4,5,6,7,9,10,10};写法非法,单个int变量不能用数组初始化列表赋值。正确的数组声明必须加[],即int arr[] = { ... };。原写法会把arr当成单个int变量,传递给函数时,这个变量的内存值会被当作指针地址,访问的是非法内存区域,因此出现随机值。 - 条件表达式语法错误:
if (arr[start >= num])的括号位置完全错误,应该是if (arr[start] >= num)。原写法中start >= num是布尔判断,结果转成int后是0或1,实际访问的是arr[0]或arr[1],完全偏离了原本要判断区间起始元素的逻辑。 - 返回值计算错误:当
arr[end] < num时,区间内所有元素都小于num,正确数量是end - start + 1,原代码返回end - start,少算了一个元素。 - 函数语法不完整:
countSmaller函数没有闭合的},直接衔接main函数,编译无法通过。 - main函数不符合标准:标准C中main函数必须是
int main(),且需要返回0表示程序正常退出。
修复后的代码
#include <stdio.h> int countSmaller(int arr[], int start, int end, int num) { // 处理递归时可能出现的非法区间 if (start > end) { return 0; } int mid = start + (end - start) / 2; if (arr[end] < num) { return end - start + 1; } if (arr[start] >= num) { return 0; } if (arr[mid] >= num) { return countSmaller(arr, start, mid, num); } // 左半部分全部小于num,加上右半部分的统计结果 return (mid - start + 1) + countSmaller(arr, mid + 1, end, num); } int main(){ int arr[] = {1,2,3,4,5,6,7,9,10,10}; int result = countSmaller(arr, 0, 9, 5); printf("结果:%d\n", result); // 输出4,符合预期 return 0; }
额外说明
- 增加了
start > end的边界判断,避免递归过程中出现非法区间导致的错误。 - 调整了左半部分元素数量的写法,
mid - start + 1比原代码的mid +1 - start更清晰,逻辑一致。 - 增加了printf输出结果,方便直接验证修复后的正确性。
内容的提问来源于stack exchange,提问作者Eitan Katz
相关产品推荐
相关产品推荐

