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

C语言代码排查:用户输入数组大小后程序异常求助

C语言代码问题排查:用户输入数组大小时程序异常的原因及修复

核心错误

你代码里的致命问题是在变量x未初始化时,就用它定义了变长数组array[x]。

在main函数里,你先声明了int x;,紧接着就写了int array[x];——这时候x还没被用户输入赋值,内存里是随机的垃圾值,数组的实际大小就是这个随机数。等你用scanf读取用户输入的x后,数组的大小并不会自动更新。如果用户输入的x比这个随机大小大,后续往数组里写元素时就会越界访问内存,破坏程序的运行环境,导致各种异常行为。而如果在程序内部提前给x赋值,x在定义数组时已经有确定的有效值,所以程序能正常运行。

修复步骤

  1. 调整数组定义的位置:把int array[x];移到scanf("%d", &x);之后,确保x有了用户输入的确定值再创建数组。
  2. 可选优化:冒泡排序效率提升:你的冒泡排序内层循环可以改成j < x-1 -i,因为每一轮排序都会把当前最大的元素放到数组末尾,已经排好的部分不需要再重复比较,能减少不必要的循环次数。
  3. 可选优化:输入合法性检查:可以判断scanf的返回值,确保用户输入的是有效的正整数,避免非法输入导致的问题。

修复后的完整代码

#include <stdio.h>
#include <string.h>

void sorting( int array[], int x){
    for (int i = 0; i < x-1; i++)
    {
        // 内层循环优化:跳过已经排好的末尾i个元素
        for (int j = 0; j < x-1 -i; j++)
        {
            if (array[j] > array[j+1])
            {
                int temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }
        }
    }
}

void printing(int array[],int x) {
    printf("\n排序后的数组:\n");
    for (int i = 0; i < x; i++)
    {
        printf("%d,	", array[i]);
    }
}

int main(){
    int x;

    printf("请输入数组的大小(正整数):\n");
    // 检查输入是否有效
    if (scanf("%d", &x) != 1 || x <= 0) {
        printf("输入无效,请输入正整数!\n");
        return 1;
    }

    // 现在x有确定值,再定义数组
    int array[x];

    printf("请输入%d个整数:\n", x);
    
    for (int i = 0; i < x; i++)
    {
        printf("输入第%d个数:\n", i+1);
        if (scanf("%d", &array[i]) != 1) {
            printf("输入无效,请输入整数!\n");
            return 1;
        }
    }

    printf("你输入的数组是:\n");
    for (int i = 0; i < x; i++)
    {
        printf("%d,	", array[i]);
    }
    
    sorting(array, x);
    printing(array, x);

    return 0;
}

内容的提问来源于stack exchange,提问作者M-A-K Tech

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:15:33