C语言固定长度数组越界赋值无报错且输出正常是什么原因
C语言数组越界赋值未报错的原因
你给出的测试代码如下:
#include<stdio.h> int main(){ int a[4]={10,20,30,40}; a[20]=57; printf("%d",a[20]); }
这个现象是C语言的特性和未定义行为的典型表现,核心原因如下:
- C语言原生不提供数组边界检查能力
为了最大化运行性能,C语言的设计将数组访问的合法性校验责任完全交给开发者。数组下标访问a[n]本质上会被编译器转换为*(a + n)的指针运算,只会根据数组首地址+偏移量计算出对应内存地址,不会判断这个偏移量是否落在数组的合法申请范围内,所以编译、运行阶段都不会主动抛出越界错误。 - 当前运行环境下操作的内存属于进程可访问范围
你此次运行时a + 20对应的内存地址刚好处于当前进程有权限读写的内存区域,没有触碰到受保护的内存页(比如内核空间、只读内存段、未分配给当前进程的内存),所以不会触发段错误导致程序崩溃。 - 赋值后立刻读取没有被其他操作覆盖
你给a[20]赋值57之后马上执行读取操作,这块内存还没有被程序的其他逻辑、或者系统调度后的其他操作修改,所以能读到你刚写入的57,而不是垃圾值。
注意:这是典型的未定义行为,完全不具备可复现性和可靠性。换编译参数、换运行环境、甚至同环境多次运行都可能出现完全不同的结果:包括但不限于读取到垃圾值、程序直接崩溃、其他变量被意外篡改、逻辑异常。实际开发中绝对不能依赖这种行为,必须自行做好数组下标合法性校验。
内容的提问来源于stack exchange,提问作者Yogesh Singh Rawat
相关产品推荐
相关产品推荐

