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

C++栈内存地址差异疑问:两段代码变量地址顺序为何不同?

为什么两段C++代码的局部变量内存地址顺序相反?

我是C++新手,写了两段代码,发现局部变量的内存地址顺序不一样,想请教原因:

第一段代码

#include <iostream>

int main()
{
    int firstInteger = 1;
    std::cout << "First memory adress: " << &firstInteger << std::endl;
    int secondInteger = 2;
    std::cout << "Second memory adress: " << &secondInteger << std::endl;

    return 0;
}

运行结果

First memory adress: 00000039A2F7F934
Second memory adress: 00000039A2F7F954

第二个整数的十六进制地址值更大。

第二段代码

#include <iostream>

void someFunction() {
    int secondInteger = 2;
    std::cout << "Second memory adress: " << &secondInteger << std::endl;
}

int main()
{
    int firstInteger = 1;
    std::cout << "First memory adress: " << &firstInteger << std::endl;
    someFunction();
    
    return 0;
}

运行结果

First memory adress: 00000093953EF744
Second memory adress: 00000093953EF624

此次第一个整数的地址值更大。


这本质是栈内存的分配规则导致的,核心点如下:

  • 所有局部变量都存储在栈内存中,栈的增长方向通常是从高地址向低地址(也就是“向下增长”)。
  • 第一段代码里的两个变量都在main函数的同一个栈帧里:编译器会在当前函数的栈帧内为局部变量分配空间,变量的地址顺序由编译器的栈布局规则(比如定义顺序、内存对齐要求)决定。这里先定义的firstInteger被分配在较低地址,后定义的secondInteger在较高地址,所以后者地址更大。
  • 第二段代码里的secondInteger在someFunction的独立栈帧里:当调用函数时,程序会为新函数创建一个新的栈帧,这个新栈帧的起始地址会比当前main函数的栈帧地址更低(因为栈向下增长)。所以someFunction里的变量地址自然比main里的变量地址小,也就出现了第一个整数地址更大的情况。

另外要注意:C++标准并没有规定栈的增长方向和局部变量的具体布局,不同编译器、编译选项甚至操作系统都可能有差异,不要依赖这种地址顺序来写代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:05:19