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

为何获取C变量a的地址会改变a与b的内存布局?

问题:为何获取变量地址会改变局部变量的内存相邻性?

带&a;的代码及输出

#include <stdio.h>
int main(void)
{
    int a;
    int b;
    a=15;
    b=2654;
    printf("%d %d\n", a, b);
    &a;
    printf("%d %d\n", a, *(&b-1));
}

输出:

15 2654
15 15

不带&a;的代码及输出

#include <stdio.h>
int main(void)
{
    int a;
    int b;
    a=15;
    b=2654;
    printf("%d %d\n", a, b);
    printf("%d %d\n", a, *(&b-1));
}

输出:

15 2654
15 21927

原因分析

这确实是编译器优化导致的,核心逻辑是C语言标准完全不约束局部变量的内存布局,编译器可根据优化策略自由调整:

  • 当代码中出现&a;时,编译器必须为变量a分配栈内存(寄存器没有内存地址,无法完成取址操作)。此时编译器会将a和b都安排在栈上,二者的内存位置恰好相邻(具体顺序取决于编译器的栈增长方向,这里表现为&b-1指向a)。
  • 当没有&a;时,编译器发现a的地址从未被使用,会直接将a的值存在CPU寄存器中,完全不为它分配栈空间。这时&b-1指向的是栈上b之前的空闲区域,里面是未初始化的垃圾数据,所以输出随机值。

这种行为完全符合C语言规范,属于未定义行为的范畴——永远不要依赖局部变量的内存布局编写代码,不同编译器、不同优化等级下结果都可能不同。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:52:11