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

C语言通过指针返回数组最大值索引报错的原因及解决方法

错误原因

  1. 指针参数的传值逻辑问题:C语言所有函数参数都是值传递,你传入的index_ptr只是main中idx指针的副本,函数内部修改index_ptr = &index;仅修改了副本的指向,不会影响外层main的idx变量。同时index是函数栈上的局部变量,函数执行结束后内存就会被回收,即使你能把地址传回main,访问这个地址也是非法的野指针访问,结果不可预期。
  2. 循环逻辑隐含bug:你当前的循环判断array[i+1] > max时,给max赋值的是array[i],给index赋值的是i,只是你的测试用例刚好巧合得到了正确的最大值,换其他用例就会出错。比如数组第一个元素是最大值的场景,你甚至没有给index初始化,会返回随机值。

修复方案

函数实现修改

// 如果使用INT_MIN需要引入头文件 #include <limits.h>
int get_biggest_index(int array[], size_t array_size, int *index_ptr){
    // 合法性校验,避免空指针、空数组问题
    if (array == NULL || array_size == 0 || index_ptr == NULL) {
        // 也可以和调用方约定返回-1作为错误标识,无需引入额外头文件
        return INT_MIN;
    }
    int max = array[0];
    int index = 0; // 初始化索引为第一个元素的位置
    for (size_t i = 1; i < array_size; i++) { // 直接从第二个元素遍历逻辑更直观
        if (array[i] > max) {
            max = array[i];
            index = i;
        }
    }
    // 直接给传入指针指向的内存地址赋值,不需要修改指针本身的指向
    *index_ptr = index;
    printf("idx: %d\n", *index_ptr); // 测试用打印,上线可删除
    return max;
}

调用侧修改

int main() {
    int arr[5] = {4, 7, 3, 9, 5};
    size_t arr_size = 5;
    int idx; // 定义int类型变量存储索引,不需要定义未初始化的野指针
    printf("biggest value in array arr => %d\n", get_biggest_index(arr, arr_size, &idx)); // 传入变量的地址
    printf("idx of biggest value => %d", idx);
    return 0;
}

其他优化建议

  • 统一循环变量类型:数组长度是size_t无符号类型,循环计数器也用size_t可以避免类型不匹配的编译警告
  • 保证函数功能单一:默认不要在功能函数中加入调试打印,避免干扰调用方的输出逻辑
  • 适配重复最大值场景:如果数组中有多个相同的最大值,当前实现会返回第一个出现的最大值的索引,如果需要返回最后一个,可以把判断条件改成array[i] >= max
  • 增加注释:核心逻辑分支、错误返回规则加上简单注释,提升代码可维护性

内容的提问来源于stack exchange,提问作者ARainyCloud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:27:03