You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何传递数组给函数后值异常改变?求原因与修复方案

问题原因与修复方案

核心错误分析

  • 数组声明错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:57:23