C语言数组循环异常:scores[4]/scores[5]时循环仅执行2次
问题分析与修复
核心问题1:未初始化变量就定义变长数组
你在写int scores[n];的时候,变量n还没被赋值,此时n是栈上的随机垃圾值。后续通过scanf输入的n并不会改变这个数组的实际大小,这会导致数组真实长度和你预期的完全不符,埋下内存访问错误的隐患。
核心问题2:数组索引越界
循环里的scanf("%i", &scores[n]);犯了低级错误——你应该用当前循环的索引i来访问数组元素,而不是用数组长度n。scores[n]已经超出了数组的合法范围(数组下标从0到n-1),这种越界访问会破坏栈上的其他变量(比如循环变量i或者n本身),这就是为什么长度4或5时循环只跑2次的原因:越界写操作直接篡改了循环的控制变量。
修正后的代码
#include <stdio.h> int main() { int n; printf("Enter the number of scores you have? "); // 先输入n,再定义变长数组 scanf("%i", &n); printf("%i\n", n); int scores[n]; for(int i = 0; i < n; i++) { printf("Enter the score:\n"); // 使用i作为数组索引,正确访问每个元素 scanf("%i", &scores[i]); printf("The number of loop condition is: %i\n", i); } return 0; }
额外说明
- 变长数组(VLA)是C99标准引入的特性,部分编译器(比如MSVC)可能不支持,如果需要兼容更多环境,可以改用动态内存分配(
malloc/free)来创建数组。 - 永远要确保数组访问的下标在合法范围内,越界访问属于未定义行为,症状可能因环境、数据不同而变化,很难调试。
内容的提问来源于stack exchange,提问作者Syed Shahabuddin
相关产品推荐
相关产品推荐

