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

为何输入一个数后C程序即终止?能否用该逻辑求最值?

问题分析与解决方案

程序崩溃的核心原因

你的程序输入一个数字就终止,是因为指针p未初始化——它指向的是内存中的随机非法地址,当你通过scanf("%d",(p+i))往这个地址写入数据时,触发了非法内存访问,直接导致程序崩溃。

能否用此逻辑求解任意数量数字的最值?

可以,但必须先修复指针的内存指向问题,让它拥有合法的内存空间。下面是两种可行的修正方案:

方案1:动态内存分配(适配任意C标准)

通过malloc为指针分配对应大小的内存,用完后记得释放:

#include<stdio.h>  
#include<stdlib.h> // 引入malloc/free的头文件

int main() // 标准C中main的返回类型应为int,而非void
{
    int *p, n, i, max, min;
    printf("How many numbers?= ");
    scanf("%d", &n);
    
    // 分配能存储n个int的内存
    p = (int*)malloc(n * sizeof(int));
    if (p == NULL) { // 检查内存分配是否成功
        printf("内存分配失败\n");
        return 1;
    }
    
    printf("\nStart entering numbers\n");
    for(i=0; i<n; i++){   
        scanf("%d", (p+i));
    }
    
    max = *(p+0);
    for(i=0; i<n; i++){
        if(*(p+i) > max) max = *(p+i);
    }
    printf("Maximum number = %d\n", max);
    
    min = *(p+0);
    for(i=0; i<n; i++){
        if(*(p+i) < min) min = *(p+i);
    }
    printf("Minimum number = %d", min);
    
    free(p); // 释放动态分配的内存
    return 0;
}

方案2:可变长度数组(C99及以上标准支持)

直接使用由用户输入的n决定大小的数组,无需手动管理内存:

#include<stdio.h>  

int main()
{
    int n, i, max, min;
    printf("How many numbers?= ");
    scanf("%d", &n);
    
    int arr[n]; // 可变长度数组,大小由n动态决定
    printf("\nStart entering numbers\n");
    for(i=0; i<n; i++){   
        scanf("%d", &arr[i]);
    }
    
    max = arr[0];
    for(i=0; i<n; i++){
        if(arr[i] > max) max = arr[i];
    }
    printf("Maximum number = %d\n", max);
    
    min = arr[0];
    for(i=0; i<n; i++){
        if(arr[i] < min) min = arr[i];
    }
    printf("Minimum number = %d", min);    
    return 0;
}

额外优化建议

可以在输入数字的同时同步更新最大值和最小值,减少一次遍历操作:

#include<stdio.h>  
#include<stdlib.h>

int main()
{
    int *p, n, i, max, min;
    printf("How many numbers?= ");
    scanf("%d", &n);
    
    p = (int*)malloc(n * sizeof(int));
    if (p == NULL) {
        printf("内存分配失败\n");
        return 1;
    }
    
    printf("\nStart entering numbers\n");
    // 输入第一个数时直接初始化max和min
    scanf("%d", p);
    max = min = *p;
    
    for(i=1; i<n; i++){   
        scanf("%d", (p+i));
        if(*(p+i) > max) max = *(p+i);
        if(*(p+i) < min) min = *(p+i);
    }
    
    printf("Maximum number = %d\n", max);
    printf("Minimum number = %d", min);
    free(p);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:36:18