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

C语言如何修改其他文件定义的const常量?指针修改跨文件常量报错

问题原因分析

  • 首先你在C语言中尝试修改const修饰的变量本身就属于未定义行为,之前在同一源文件能运行只是巧合,不代表操作合法:
    1. 全局const变量默认会被编译器分配到只读数据段(.rodata),该段内存被操作系统标记为只读权限,强行写入会触发段错误,就是你看到的"内存无法写入"报错。
    2. 你代码里的写法存在冗余错误:已经通过#include "File1.c"把File1.c的完整内容导入到File2.c中,就不需要再重复写extern int const age声明,extern仅用于不同编译单元分别编译后链接的场景。

不推荐的实现方案(仅作学习演示,生产环境禁止使用)

如果只是做学习测试,要实现修改跨文件const全局变量的效果,可以用两种方法强制让const变量所在内存可写:

  1. 编译阶段强制将const变量放到可写数据段
    在File1.c中用编译器扩展属性标记变量,GCC/Clang写法如下:
// File1.c
int const __attribute__((section(".data"))) age = 34;

该属性会强制把原本要放到.rodata的变量放到可写的.data段,就可以正常用指针修改。

  1. 运行时修改内存页权限
    调用系统API临时修改const变量所在内存页的读写权限,Linux下用mprotect接口,Windows下用VirtualProtect接口,修改完成后再写入即可。

重要提示

const的设计初衷就是标记不可修改的变量,任何强行修改const变量的操作都会破坏代码的可读性与可维护性,还可能触发不可预知的运行时问题,非特殊场景绝对不要使用这类黑科技操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:36:02