为何for循环出现越界取值?C语言数组越界循环异常问询
解决你的C语言循环失控与数组越界问题
嘿,我一眼就看到了你代码里的核心问题——数组声明时机错误导致的越界写入,直接破坏了循环变量的内存,这就是循环停不下来、i变成100/101的根本原因。咱们一步步拆解:
问题根源分析
- 数组长度为0,完全没存储空间:你在
i=0的时候声明了char a[i];,这意味着创建了一个长度为0的数组(C99允许变长数组,但长度为0属于未定义行为)。这个数组根本装不下任何字符,后续的a[i]访问全是越界操作。 - 越界写入篡改栈变量:栈上的变量是按顺序排列的(比如
n、i、m,紧接着就是数组a)。当你往a[1]、a[2]这些不存在的位置写字符时,其实是在覆盖栈上其他变量的内存。从你的输出能明显看出来,写入的字符直接修改了循环变量i的值,导致i<=n的循环条件彻底失效,循环自然停不下来。 - 索引从1开始的坏习惯:C语言数组索引是从0开始的,即使数组长度正确,从
i=1开始访问也会浪费第一个元素,还会增加越界风险。
修复后的代码
我把你的代码修正了,每一处修改都贴合C语言的规范:
#include <stdio.h> #include <string.h> #include <math.h> int main() { int n, i; // 先获取用户输入的字符数量n,再根据n创建数组 printf("how many characters you want to enter="); scanf("%d", &n); // 声明长度为n的变长数组,有足够空间存储输入的字符 char a[n]; // 循环从0开始,到n-1结束,严格符合C数组索引规则,避免越界 for (i = 0; i < n; i++) { scanf(" %c", &a[i]); printf("%d\n", i); } // 同样从0开始遍历输出 for (i = 0; i < n; i++) { printf("%c \t", a[i]); } return 0; // 规范main函数的返回值 }
兼容老编译器的方案
如果你的编译器不支持C99的变长数组(比如老版本的MSVC),可以用动态内存分配替代:
#include <stdio.h> #include <stdlib.h> // 需要引入malloc/free的头文件 #include <string.h> #include <math.h> int main() { int n, i; printf("how many characters you want to enter="); scanf("%d", &n); // 动态分配内存,长度为n char *a = (char*)malloc(n * sizeof(char)); if (a == NULL) { // 检查内存分配是否成功,避免空指针 printf("Memory allocation failed!\n"); return 1; } for (i = 0; i < n; i++) { scanf(" %c", &a[i]); printf("%d\n", i); } for (i = 0; i < n; i++) { printf("%c \t", a[i]); } free(a); // 记得释放动态分配的内存,避免内存泄漏 return 0; }
内容的提问来源于stack exchange,提问作者Pranshu_Taneja
相关产品推荐
相关产品推荐

