C语言数组最值求解异常及指针赋值合法性疑问求助
问题解答
问题一:最小元素固定返回0的解决方法
你的代码存在两个核心问题:
- 数组越界访问:当循环变量
i或j等于size-1时,*(dizi + i + 1)会访问数组范围外的内存(数组合法索引为0到size-1),读取到未初始化的垃圾值,导致最小值计算错误。 - 最值逻辑错误:当前逻辑仅每次比较相邻两个元素,最后保留的是最后一次比较的结果,并未遍历整个数组找出全局的最大/最小值。
修正后的代码
#include <stdio.h> void arrayFonk(int *dizi, int size, int *minimum, int *maximum){ // 初始化最值为数组第一个元素 *maximum = dizi[0]; *minimum = dizi[0]; // 从第二个元素开始遍历比较 for(int i = 1; i < size; i++){ if(dizi[i] > *maximum){ *maximum = dizi[i]; } if(dizi[i] < *minimum){ *minimum = dizi[i]; } } } int main() { int a[] = {1, 2, 3, 4, 5}; int min, max; arrayFonk(a, 5, &min, &max); printf("En büyük değer: %d\n", max); printf("En küçük değer: %d\n", min); return 0; }
修正说明
- 先将
maximum和minimum初始化为数组第一个元素,确保从有效数据开始比较。 - 循环从索引1开始遍历整个数组,逐个元素与当前最值比较,更新全局的最大/最小值。
- 彻底避免了数组越界问题,逻辑简洁可靠。
问题二:指针赋值的语法与功能说明
在指针定义正确的前提下,*minimum = *(array + i);的语法和功能都是正确的:
*(array + i)等价于array[i],表示数组第i个元素的数值。*minimum表示指针minimum指向的内存地址中存储的值。- 这个语句本质是把数组第
i个元素的数值,赋值给minimum指针指向的变量(比如main函数中的min),完全符合C语言语法规则,功能上就是完成两个int类型变量的赋值操作,只是通过指针间接访问实现。
内容的提问来源于stack exchange,提问作者Game of HB - YT
相关产品推荐
相关产品推荐

