使用指针实现数组最值查找遇问题,求代码错误排查
问题分析与修复
一、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
相关产品推荐
相关产品推荐

