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

指针问题排查:数组最值无法输出的原因及指针设置疑问

问题根源分析
  • 核心错误:main函数中的maxPtr和minPtr是未初始化的野指针,它们没有指向任何有效的内存地址。当MaxAndMin函数执行**max = arr[0]这类操作时,本质是对一块随机内存地址进行写操作,触发C语言的未定义行为——程序会直接崩溃、输出乱码,或像你遇到的那样提前终止,根本执行不到最后的打印语句。
修正方案

方案1:贴合原有逻辑的修正

给指针分配有效内存,让它们指向实际存储结果的变量:

#include <stdio.h>

void MaxAndMin(int* arr, int** max, int** min)
{
    int i;
    **max = **min = arr[0];
    for (i = 1; i < 5; i++)
    {
        if (**max < arr[i])
        {
            **max = arr[i];
        }
    }
    for (i = 1; i < 5; i++)
    {
        if (**min > arr[i])
        {
            **min = arr[i];
        }
    }
}

int main(void)
{
    int maxVal, minVal; // 定义存储结果的实际变量
    int* maxPtr = &maxVal; // 让指针指向有效内存
    int* minPtr = &minVal;
    int arr[5];
    int i;
    for (i = 0; i < 5; i++)
    {
        printf("입력:");
        scanf("%d", &arr[i]);
        printf("\n");
    }
    MaxAndMin(arr, &maxPtr, &minPtr);
    printf("%d %d", *maxPtr, *minPtr);
    return 0;
}

方案2:简化指针逻辑(更简洁易读)

不需要使用二级指针,直接让函数接收存储结果的变量地址,避免野指针风险:

#include <stdio.h>

void MaxAndMin(int* arr, int* max, int* min)
{
    int i;
    *max = *min = arr[0];
    // 合并循环,减少遍历次数
    for (i = 1; i < 5; i++)
    {
        if (*max < arr[i])
            *max = arr[i];
        if (*min > arr[i])
            *min = arr[i];
    }
}

int main(void)
{
    int maxVal, minVal;
    int arr[5];
    int i;
    for (i = 0; i < 5; i++)
    {
        printf("입력:");
        scanf("%d", &arr[i]);
        printf("\n");
    }
    MaxAndMin(arr, &maxVal, &minVal);
    printf("%d %d", maxVal, minVal);
    return 0;
}
额外优化建议
  • 把数组长度定义为宏(比如#define ARR_LEN 5),避免代码中硬写数字,方便后续修改;
  • 合并查找最大值和最小值的循环,减少一次数组遍历,提升效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 10:02:56