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
相关产品推荐
相关产品推荐

