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

C语言数组最值求解异常及指针赋值合法性疑问求助

问题解答

问题一:最小元素固定返回0的解决方法

你的代码存在两个核心问题:

  1. 数组越界访问:当循环变量i或j等于size-1时,*(dizi + i + 1)会访问数组范围外的内存(数组合法索引为0到size-1),读取到未初始化的垃圾值,导致最小值计算错误。
  2. 最值逻辑错误:当前逻辑仅每次比较相邻两个元素,最后保留的是最后一次比较的结果,并未遍历整个数组找出全局的最大/最小值。

修正后的代码

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:34:53