C++ 函数变量地址问题

#include <iostream>
using namespace std;

void test() {
    int a,b;
    int *c = new int;
    int *d = new int;
    cout << &a << endl;
    cout << &b << endl;
    cout << c << endl;
    cout << d << endl;
    delete c;
    delete d;
}

int main() {
    test();
}

在我的电脑上运行的结果如下。请问栈不应该是向地址低的地方生长吗,为什么b的地址更高呢?
为什么堆分配的两个int变量地址相隔了20个字节呢?(多次运行都是20),谢谢!

0x7ffc5c793ed0
0x7ffc5c793ed4
0x16f1c20
0x16f1c40

阅读 2.2k
2 个回答

在我机器上用g++ 6.4.0,不开启优化,ab的地址还是由高到低,开启优化后就变成由低到高了:

~ $ g++ test.cpp
~ $ ./a
0xffffcbbc
0xffffcbb8
0x600000480
0x6000004a0
~ $ g++ test.cpp -O2
~ $ ./a
0xffffcba8
0xffffcbac
0x600000480
0x6000004a0

这里是不是有什么玄机?然而用clang++再试,发现不管开不开启优化,都是由高到低分配的。编译器可以自行安排变量的地址,只要保证程序执行结果正确即可。所谓“栈向低地址生长”只是一个实现的模型,并不是绝对的。

至于cd,更没有规定说要连续分配了。实际上在向操作系统申请内存的时候,一般都是多给一些的,用不满就浪费了,没什么大不了。

新手上路,请多包涵

地址相差0x20,并不是20个字节,
0x20 = 32 bit(十进制)=4 Byte
应该是隔了32个比特位吧,也就是这个指针占4个字节的位置大小,合理的分配。
堆的分配和栈不同,堆是链式分配(地址不一定连续),栈是顺序分配的(地址连续)。因此,在你这里我感觉是碰巧了,其实堆的地址你是捉摸不透的,栈你倒是可以知道他们的大概。像萝卜的答案里写的,动态申请的时候会多分配,我感觉有点不妥。像是更高级的vector,倒是这样实现的,不过机器就是机器,你申请多少,他就给你多少。

以上是个人意见,多多交流!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题