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

GCC8.3.0下修改extern声明的const全局变量为何编译无错报段错误

编译阶段没有抛出预期报错的原因

C语言采用独立编译模型,每个源文件会单独完成编译,不会跨文件校验符号的类型属性:

  • 编译a.c时,编译器知道全局变量i是const修饰的只读变量,会将其分配到只读数据段,但const属于编译期的类型限定符,不会写入目标文件的符号表中。
  • 编译b.c时,编译器只能看到你声明的extern int i,完全没有途径得知i在其他文件中带有const修饰,自然不会触发const相关的警告。取&i赋值给int*指针、后续修改*ptr的操作,在当前编译单元的语法检查中都是合法的。
  • 链接阶段,链接器仅校验符号是否存在,不会检查符号的类型限定符是否匹配,因此整个编译链接流程可以顺利通过。

如果需要提前发现这类问题,可以开启GCC的链接时优化参数-flto,此时编译器会在链接阶段跨文件分析符号属性,会抛出类型不匹配的警告。

运行时触发段错误的原因

全局const变量编译后会被放入进程地址空间的只读数据段,这个段的内存页被操作系统标记为只读权限,禁止写入。你通过指针修改*ptr = 99的操作,本质是尝试写入只读内存页,操作系统会直接触发内存访问异常,也就是你遇到的Segmentation fault。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:18:04