数组最后一个元素之后的元素为何非零?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
相关产品推荐
相关产品推荐

