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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 17:35:09