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

C语言数组越界赋值仍输出3?gcc编译无报错的疑问

数组越界为啥有时能“正常工作”?
  • C语言里数组越界是未定义行为
    C标准没规定这种情况必须报错或者输出垃圾值,编译器完全可以自由处理。你遇到的输出3,只是刚好数组末尾后的那块内存暂时没被其他数据占用,赋值后读出来自然是3,但这纯属巧合,绝不是合理的预期结果。

  • gcc不报错的原因
    本地gcc默认编译选项不会主动检测数组越界,它只会按代码生成机器指令——你写了给i[2]赋值,它就去对应内存地址写入,只要那块内存当前属于进程可写范围,就不会触发报错。但要是后续代码占用了这块内存,或者换个编译环境、优化等级,结果会完全不可控。

  • 在线编辑器报错是因为启用了检测工具
    很多在线编辑器默认开启了地址 sanitizer 这类调试工具,会主动扫描数组越界这类危险行为,一发现就抛出错误。你本地gcc如果加上-fsanitize=address编译选项,运行时也会得到同样的报错提示。

  • 怎么避免踩这个坑

    • 写代码时严格控制数组下标,确保在0到数组长度-1的合法范围内
    • 编译时添加-Wall -Wextra选项,能提前触发部分越界相关的警告
    • 调试阶段启用-fsanitize=address,直接定位越界问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:30:58