C 突破编译器限制

const 局部常量(栈上)突破限制

核心原理

  1. 内存位置:const修饰的局部常量存放在栈区,栈内存属性:可读、可写
  2. const 的本质:仅编译器层面的语法检查,不是硬件 / 内存读写保护
  3. 差异:修改局部常量编译器拦截;指针解引用修改内存可以绕过编译器检查
    ⚠️注意:全局const常量放在只读段 (.rdata),这种方法修改会直接程序崩溃,和栈上局部 const 不是一回事!

代码示例

c 复制代码
#include <stdio.h>
int main(void)
{
    int a = 0;
    const int b = 0; // 栈上局部const常量

    a = 1;   // ✅正常修改普通局部变量
    // b = 2; // ❌编译报错:表达式必须是可修改的左值

    int* p = &b;   // 取const常量地址,转成普通int指针
    *p = 2;        // 通过指针修改栈内存,绕过编译器const检查
    printf("a = %d\n", a);
    printf("b = %d\n", b);  //b=2
    printf("*p = %d\n", *p);
    return 0;
}

汇编对照(x86)

c 复制代码
; int a = 0
    mov dword ptr [ebp-0Ch],0
; const int b = 0
    mov dword ptr [ebp-18h],0
; *p = 2  指针修改
    mov eax,dword ptr [ebp-10h]
    mov dword ptr [eax],2

● 普通变量、栈 const 常量初始化汇编指令完全一样,只是栈偏移不同

● 编译器不会生成任何保护内存的硬件指令,仅在编译阶段拦截直接赋值

重点结论

  1. 局部const常量:栈内存可写,仅编译器语法限制,指针可修改
  2. 全局const常量:放在只读段,内存硬件保护,指针修改触发访问异常崩溃
  3. 工程规范:不推荐这种写法,破坏const语义,可读性差,属于逆向底层研究技巧,正式项目禁止使用

区分

类型 存放位置 能否用指针修改
普通局部变量 栈区 ✅ 可以
const 局部常量 栈区 ✅ 可以(仅编译器拦截直接赋值)
const 全局常量 .rdata 只读段 ❌ 修改直接崩溃
相关推荐
jimy11 小时前
C++ 虚函数表:基类和派生类共用一张 vtable 吗?
开发语言·c++
爱吃提升2 小时前
Dev-C++ 5.11 C++断点调试完整教程
开发语言·c++
夜晚回家2 小时前
Python 原始字符串详解 | r 前缀到底让什么不再转义
开发语言·python
陈年老古董2 小时前
PyQt5 入门指南:环境搭建、PyCharm 外部工具配置与登录界面实战
开发语言·qt·pycharm
看浪的路人2 小时前
第7讲:大模型后端服务化——Go 实现高并发 LLM Proxy / Router / Fallback
开发语言·后端·golang
iCxhust2 小时前
Matlab求解发电机的极限切除角
开发语言·算法·matlab·电力系统
zhanghaha13142 小时前
Qt 类完整例程【逐词拆解 + 逐步骤执行保姆教程】
开发语言·qt
endeavor123 小时前
can总线(五)
c语言·stm32·单片机·can
code2cat3 小时前
Java进阶篇之AtomicReferenceFieldUpdater:用不可变快照替换整份状态
java·开发语言·cas