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

C语言循环运行异常:输入数组时仅读取一个数就退出循环

问题分析与修复:C语言数组输入异常仅读取一个元素就退出

问题描述

编写的C语言代码预期读取两个整数m和n,接着读取n个整数存入数组x[n]中,但运行时仅读取一个数就退出循环,无法完成n个元素的输入。代码如下:

#include <stdio.h>

int main()
{
    int m = 0;
    int n = 0;
    int x[n];
    scanf("%d", &m);
    scanf("%d", &n);
    for(int i = 0 ;i < n;i++)
    {
        scanf("%d", &x[i]);
    }
}

错误原因

  • 核心问题是变量长度数组(VLA)x[n]的定义时机错误。你在n初始化为0时就定义了数组,此时数组长度固定为0。后续通过scanf修改n的值,不会改变已定义数组的长度。
  • 向长度为0的数组写入元素属于未定义行为,程序会出现不可预测的异常(比如提前退出、崩溃等),这就是你遇到的问题根源。

修复方案

方案1:调整变量定义顺序(C99及以上版本支持)

先读取n的值,再定义变量长度数组,确保数组长度符合预期:

#include <stdio.h>

int main()
{
    int m = 0;
    int n = 0;
    // 先读取m和n的值,再定义数组
    scanf("%d", &m);
    scanf("%d", &n);
    int x[n];
    for(int i = 0 ;i < n;i++)
    {
        scanf("%d", &x[i]);
    }
    // 可选:添加输入验证打印
    for(int i = 0; i < n; i++){
        printf("%d ", x[i]);
    }
    return 0;
}

方案2:使用动态内存分配(兼容所有C标准)

如果需要兼容C89等不支持VLA的版本,推荐使用malloc动态分配内存,更灵活且安全:

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

int main()
{
    int m = 0;
    int n = 0;
    int *x = NULL;
    scanf("%d", &m);
    scanf("%d", &n);
    // 动态分配内存,检查分配是否成功
    x = malloc(n * sizeof(int));
    if(x == NULL){
        fprintf(stderr, "内存分配失败\n");
        return 1;
    }
    for(int i = 0 ;i < n;i++)
    {
        scanf("%d", &x[i]);
    }
    // 可选:验证输入结果
    for(int i = 0; i < n; i++){
        printf("%d ", x[i]);
    }
    // 释放动态分配的内存,避免内存泄漏
    free(x);
    x = NULL;
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:02:36