C语言如何修改其他文件定义的const常量?指针修改跨文件常量报错
问题原因分析
- 首先你在C语言中尝试修改
const修饰的变量本身就属于未定义行为,之前在同一源文件能运行只是巧合,不代表操作合法:- 全局
const变量默认会被编译器分配到只读数据段(.rodata),该段内存被操作系统标记为只读权限,强行写入会触发段错误,就是你看到的"内存无法写入"报错。 - 你代码里的写法存在冗余错误:已经通过
#include "File1.c"把File1.c的完整内容导入到File2.c中,就不需要再重复写extern int const age声明,extern仅用于不同编译单元分别编译后链接的场景。
- 全局
不推荐的实现方案(仅作学习演示,生产环境禁止使用)
如果只是做学习测试,要实现修改跨文件const全局变量的效果,可以用两种方法强制让const变量所在内存可写:
- 编译阶段强制将const变量放到可写数据段
在File1.c中用编译器扩展属性标记变量,GCC/Clang写法如下:
// File1.c int const __attribute__((section(".data"))) age = 34;
该属性会强制把原本要放到.rodata的变量放到可写的.data段,就可以正常用指针修改。
- 运行时修改内存页权限
调用系统API临时修改const变量所在内存页的读写权限,Linux下用mprotect接口,Windows下用VirtualProtect接口,修改完成后再写入即可。
重要提示
const的设计初衷就是标记不可修改的变量,任何强行修改const变量的操作都会破坏代码的可读性与可维护性,还可能触发不可预知的运行时问题,非特殊场景绝对不要使用这类黑科技操作。
内容的提问来源于stack exchange,提问作者Oriol
相关产品推荐
相关产品推荐

