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

数组最后一个元素之后的元素为何非零?C语言数组疑问

问题解答

首先看你的代码:

#include <stdio.h>

int main(void) {
    int a[12];
    printf("%d\n", a[10]);
    printf("%d\n", a[11]);
    printf("%d, this is element with index 12\n", a[12]);
    printf("%d\n", a[13]);

    char v[12];
    printf("\n");
    printf("%d\n", v[10]);
    printf("%d\n", v[11]);
    printf("%d, this is element with index 12\n", v[12]);
    printf("%d\n", v[13]);

    /*
    Output:

    0
    0
    249560352, this is element with index 12
    232

    0
    0
    -96, this is element with index 12
    -4
    */
}

核心问题解释

  • 数组越界访问属于未定义行为:C语言里,数组长度为12时,合法索引只有0到11。访问a[12]、a[13]或者v[12]、v[13]都是越界操作,这部分内存根本不属于你定义的数组,C标准不会规定这里的内容是什么。
  • 空终止符不是数组的默认规则:空终止符(数值为0的'\0')是C字符串的约定,只有当你把char数组当作字符串使用(比如用字符串常量初始化、调用strcpy这类字符串处理函数)时,才会在末尾自动添加。普通的int数组或者未初始化的char数组,越界区域和空终止符没有任何关系。
  • 未初始化数组的初始值是随机的:你看到a[10]、a[11]是0只是巧合——局部变量(包括数组)存在栈内存里,栈里的旧数据可能刚好是0,但这不是必然结果,换个运行环境或者重新启动程序,这些值可能就会变化。越界访问到的那些奇怪数值,其实是栈里其他变量的残留数据,每次运行都可能不一样。

总结:绝对不能依赖数组越界后的内存值,这完全是随机的,而且这种写法本身就违反C语言的规则,可能导致程序崩溃或者其他诡异问题。

内容的提问来源于stack exchange,提问作者user394334

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:05:04