C语言使用scanf()时for循环i=1后运行异常问题咨询
问题根因
代码存在两个核心bug,共同导致运行异常:
scanf格式字符串写法错误:格式串中%d后额外添加的换行符\n是程序卡住的直接诱因。scanf对格式串中空白字符(换行、空格、制表符)的处理逻辑是连续匹配输入流中任意数量的空白字符,直到遇到第一个非空白字符才停止匹配。输入数字按下回车后,输入流里的换行符会被格式串里的\n持续匹配,scanf会一直阻塞等待空白输入结束,直到用户输入非空白的字母时才会终止本次匹配,进入下一轮循环,表现为程序停止响应、必须输字母才能继续。- 内存越界访问(致命问题):
main函数中定义的int arr[] = {};是零长度数组,属于编译器扩展语法,本身没有分配任何可存储int类型元素的合法内存空间。同时代码中使用arr[i+1]作为写入地址,就算提前给数组分配了4个元素的空间,最后一轮循环i=3时会访问arr[4],依然超出数组边界。这类越界写入属于C语言标准定义的未定义行为,直接导致输入值无法正确存储、程序运行逻辑混乱,严重时会直接触发段错误崩溃。
修复方案
针对问题点逐一修正即可:
- 删除
scanf格式串中%d后多余的\n,仅保留"%d"作为格式匹配串。 - 为数组分配足够的合法内存:如果需要固定存储4个int值,定义数组时显式指定长度为4;如果要适配可变长度的输入需求,也可以根据传入的参数n通过
malloc动态申请堆内存。 - 修正数组访问下标,从下标0开始依次写入输入值,避免越界和空间浪费。
修复后的可运行代码如下:
#include <stdio.h> #include <stdlib.h> void add(int *arr, int n); int main() { // 显式定义长度为4的数组,分配足够的合法存储内存 int arr[4]; add(arr, 4); // 验证输入结果 for (int i = 0; i < 4; i++) { printf("arr[%d] = %d\n", i, arr[i]); } return 0; } void add(int *arr, int n) { for (int i = 0; i < n; i++) { printf("%d index is : ", i); // 移除格式串多余换行,使用下标i从0开始写入 scanf("%d", &arr[i]); } }
内容的提问来源于stack exchange,提问作者Aditya Paluskar
相关产品推荐
相关产品推荐

