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

使用指针实现数组最值查找遇问题,求代码错误排查

问题分析与修复

一、FindMinMax函数的逻辑错误

你的函数存在关键逻辑漏洞:初始化minVal和maxVal作为比较基准后,后续找到更大/更小值时,仅修改了指针参数*max/*min,却未更新minVal和maxVal。这会导致后续循环的比较基准始终是数组第一个元素,而非当前已找到的最小/最大值,最终返回错误结果。

比如数组[5,1,4,2]的执行过程:

  • 初始minVal=5,*min未赋值
  • i=1:1<5 → *min=1,但minVal仍为5
  • i=2:4<5 → 错误将*min改为4
  • i=3:2<5 → *min改为2
    最终得到的最小值是2,而非正确的1。

修复后的函数代码

void FindMinMax(const int array[], int size, int* min, int* max)
{
    // 校验参数合法性,避免空指针或无效长度
    if (array == NULL || min == NULL || max == NULL || size <= 0) {
        return;
    }

    int minVal = array[0];
    int maxVal = array[0];
    int i;
    
    for (i = 1; i < size; i++) {
        if (array[i] > maxVal) {
            maxVal = array[i]; // 先更新比较基准
        }
        if (array[i] < minVal) {
            minVal = array[i]; // 先更新比较基准
        }
    }
    // 循环结束后统一赋值给指针参数
    *min = minVal;
    *max = maxVal;
}

也可以直接用指针指向的值作为基准,省去中间变量:

void FindMinMax(const int array[], int size, int* min, int* max)
{
    if (array == NULL || min == NULL || max == NULL || size <= 0) {
        return;
    }

    *min = array[0];
    *max = array[0];
    int i;
    
    for (i = 1; i < size; i++) {
        if (array[i] > *max) {
            *max = array[i];
        }
        if (array[i] < *min) {
            *min = array[i];
        }
    }
}

二、数组声明时传入size报错的问题

你遇到的是**变长数组(VLA)**的兼容性问题:

  • C99标准允许用变量作为数组大小声明栈上数组(如int arr[size];),但部分编译器默认未开启C99支持,且C++标准不支持变长数组(仅部分编译器作为扩展支持),因此会报错。

解决方法

  • 动态内存分配(兼容性最优):
int* arr = (int*)malloc(size * sizeof(int));
// 使用完数组后必须释放内存
free(arr);
  • 改用常量定义数组大小:
    若size是固定值,可通过宏定义常量,比如#define ARR_SIZE 10,再声明int arr[ARR_SIZE];。
  • 开启编译器C99支持:
    以GCC为例,添加编译选项-std=c99或-std=gnu99,即可允许使用变长数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:20:20