C语言数组越界赋值仍输出3?gcc编译无报错的疑问
数组越界为啥有时能“正常工作”?
C语言里数组越界是未定义行为
C标准没规定这种情况必须报错或者输出垃圾值,编译器完全可以自由处理。你遇到的输出3,只是刚好数组末尾后的那块内存暂时没被其他数据占用,赋值后读出来自然是3,但这纯属巧合,绝不是合理的预期结果。gcc不报错的原因
本地gcc默认编译选项不会主动检测数组越界,它只会按代码生成机器指令——你写了给i[2]赋值,它就去对应内存地址写入,只要那块内存当前属于进程可写范围,就不会触发报错。但要是后续代码占用了这块内存,或者换个编译环境、优化等级,结果会完全不可控。在线编辑器报错是因为启用了检测工具
很多在线编辑器默认开启了地址 sanitizer 这类调试工具,会主动扫描数组越界这类危险行为,一发现就抛出错误。你本地gcc如果加上-fsanitize=address编译选项,运行时也会得到同样的报错提示。怎么避免踩这个坑
- 写代码时严格控制数组下标,确保在
0到数组长度-1的合法范围内 - 编译时添加
-Wall -Wextra选项,能提前触发部分越界相关的警告 - 调试阶段启用
-fsanitize=address,直接定位越界问题
- 写代码时严格控制数组下标,确保在
内容的提问来源于stack exchange,提问作者Rayden
相关产品推荐
相关产品推荐

