C语言数组循环打印输出元素超量,为何会出现5次100输出?
为什么这段C代码会输出5次100?
先看你提供的代码:
#include <stdio.h> #include <stdlib.h> int main() { int i, pin[3], arr[3]; pin[0] = 20; for( i=0; i<4; i++) { arr[i] = 100; printf("%d\n",arr[i]); } printf("%d\n",pin[0]); return 0; }
错误核心:数组越界引发的未定义行为
这段代码的问题在于数组越界访问,具体原因和运行现象拆解如下:
数组长度与循环范围不匹配
你声明的arr是长度为3的数组,合法下标只能是0、1、2,但循环条件写的是i<4,会让循环执行4次(i从0到3)。当i=3时,arr[3]属于越界访问数组之外的内存空间——C语言不会做数组下标合法性检查,这种操作属于「未定义行为」,具体表现由编译器的内存布局决定。栈内存布局导致变量被覆盖
main函数里的局部变量(i、pin、arr)都分配在栈上。很多编译器会按声明的逆序分配栈变量:先分配arr数组,再分配pin数组,最后分配i。由于栈内存通常是向下生长的,arr最后一个元素arr[2]的下一个内存地址,刚好就是pin数组第一个元素pin[0]的地址。
当循环执行到i=3时,arr[3] = 100实际上是把pin[0]原本的20改成了100。输出5次100的原因
循环里的4次printf每次输出100,最后一次printf("%d\n",pin[0])输出的是被修改后的100,所以总共会输出5次100。
注意:这种未定义行为的表现不是固定的,换个编译器或编译选项,可能会出现其他结果(比如程序崩溃、输出随机值),数组越界是C语言里的常见危险操作,一定要避免。
内容的提问来源于stack exchange,提问作者Nksho27
相关产品推荐
相关产品推荐

