You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

给定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 16:32:21