给定C代码中数组大小异常行为的原因解析
数组越界为何能成功存入元素?
先看你给出的代码:
#include<stdio.h> int main(){ int n; printf("Enter the number:"); scanf("%d",&n); int array[n]; for (int i=0;i<=n;i++){ printf("%dEnter the number:",i); scanf("%d",&array[i]); } for (int i=n;i>=0;i--){ printf("%d\n",array[i]); } }
核心问题是数组越界访问:
- 你定义的
array[n]是变长数组,合法的索引范围是0到n-1,总共只能存n个元素; - 但第一个循环的条件是
i<=n,这会让程序尝试写入array[0]到array[n],一共n+1个位置,其中array[n]已经超出了数组的内存边界。
至于为什么能成功存入,本质是C语言没有运行时边界检查机制:
当你越界写入时,只是在修改数组后面相邻的内存空间——这块内存可能是栈上的其他变量、函数调用的返回地址,或者是暂时未被使用的空白区域。这次你没遇到崩溃,只是刚好没踩到会直接触发程序错误的内存区域,但这种行为属于未定义行为:
- 它可能在某次运行时正常,下次就突然崩溃;
- 可能悄悄篡改其他变量的值,导致程序出现毫无头绪的逻辑错误;
- 极端情况下,甚至可能被利用来执行恶意代码。
要修复这个问题,只需要把第一个循环的条件改成i < n,这样就只会写入n个元素,完全符合数组的容量限制。
内容的提问来源于stack exchange,提问作者Shuvarthi Dey
相关产品推荐
相关产品推荐

