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

为何删除可执行文件后,VS Code中重运行程序的变量地址仍不变?

为什么重新编译后变量的内存地址始终不变?

测试代码

#include <iostream>

using namespace std;

int main() {
    int a = 5;
    int *ptr = &a;
    cout << ptr;

    return 0;
}

原因解析

这种情况核心和**地址空间布局随机化(ASLR)**以及编译环境配置有关:

  • ASLR未启用:现代操作系统靠ASLR随机化程序加载的虚拟内存地址,以此提升安全性。如果你的系统或编译配置关闭了ASLR,程序每次启动都会被加载到相同的虚拟内存区域,栈上变量的相对位置固定,所以a的地址不会变化。VS Code默认使用的编译器(如MSVC、GCC)在部分场景下可能默认关闭ASLR,或者系统全局ASLR处于关闭状态。
  • 简单程序的编译优化:你的代码逻辑非常简单,编译器可能会固定栈帧布局,再加上没有ASLR的随机化加持,就会导致变量地址每次运行都一致。
  • 可执行文件删除不影响加载逻辑:删除旧的可执行文件后,重新编译生成的程序在ASLR未启用的情况下,加载地址和栈布局规则和之前完全一致,所以变量地址不会改变。

验证与解决方法

如果想让变量地址每次运行都不同,只需开启ASLR:

  • Windows系统(MSVC编译器):编译时添加/DYNAMICBASE参数,生成的可执行文件会支持ASLR。可以用dumpbin /headers 程序名.exe查看是否带有Dynamic base标记来确认。
  • Linux系统(GCC/Clang编译器):编译时添加-fPIE -pie参数,生成位置无关可执行文件,触发系统ASLR。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 21:44:58