scanf循环向数组赋值时首输入被忽略,输出异常求助
问题分析与修复:C语言数组输入输出异常
核心问题
你这段代码的根本错误是变量Q在声明变长数组A、B时未初始化,直接触发了未定义行为:
- 当执行
int Q, A[Q], B[Q];时,Q是未初始化的自动局部变量,值为栈内存中的随机垃圾值。此时创建的A和B是变长数组(VLA),大小由该随机值决定,这本身就违反了C语言的规范。 - 后续通过
scanf给Q赋值为3,但数组A、B的大小不会随Q的更新而改变,依然保持之前的随机垃圾值。 - 栈内存通常是连续布局的,
Q的内存位置很可能与数组A、B的存储区域重叠。当你向数组元素写入数据时,会意外覆盖其他内存区域的内容——比如你的案例中,A[i]和B[i]的内存地址重合,导致第二个输入值覆盖了第一个,最终输出重复的第二个数。
修复方案
方案1:调整声明顺序(优先使用)
先读取Q的有效值,再基于确定的Q声明数组:
#include <stdio.h> int main() { int Q; // 先获取Q的有效值 scanf("%d", &Q); // 再用Q声明数组 int A[Q], B[Q]; for(int i=0; i<Q; i++){ scanf("%d %d", &A[i], &B[i]); } for(int i=0; i<Q; i++){ printf("%d %d\n", A[i], B[i]); } return 0; }
方案2:动态内存分配(适合大数组场景)
如果Q的值可能很大,栈上的变长数组容易引发栈溢出,推荐使用malloc动态分配内存:
#include <stdio.h> #include <stdlib.h> int main() { int Q; scanf("%d", &Q); // 动态分配内存 int *A = malloc(Q * sizeof(int)); int *B = malloc(Q * sizeof(int)); // 检查内存分配是否成功 if(A == NULL || B == NULL){ printf("内存分配失败\n"); return 1; } for(int i=0; i<Q; i++){ scanf("%d %d", &A[i], &B[i]); } for(int i=0; i<Q; i++){ printf("%d %d\n", A[i], B[i]); } // 释放动态分配的内存 free(A); free(B); return 0; }
内容的提问来源于stack exchange,提问作者kaynan.ghael
相关产品推荐
相关产品推荐

