鍍金池/ 問答/C++/ C++ 函數(shù)變量地址問題

C++ 函數(shù)變量地址問題

#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();
}

在我的電腦上運行的結(jié)果如下。請問棧不應(yīng)該是向地址低的地方生長嗎,為什么b的地址更高呢?
為什么堆分配的兩個int變量地址相隔了20個字節(jié)呢?(多次運行都是20),謝謝!

0x7ffc5c793ed0
0x7ffc5c793ed4
0x16f1c20
0x16f1c40

回答
編輯回答
落殤

在我機(jī)器上用g++ 6.4.0,不開啟優(yōu)化,a、b的地址還是由高到低,開啟優(yōu)化后就變成由低到高了:

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

這里是不是有什么玄機(jī)?然而用clang++再試,發(fā)現(xiàn)不管開不開啟優(yōu)化,都是由高到低分配的。編譯器可以自行安排變量的地址,只要保證程序執(zhí)行結(jié)果正確即可。所謂“棧向低地址生長”只是一個實現(xiàn)的模型,并不是絕對的。

至于c、d,更沒有規(guī)定說要連續(xù)分配了。實際上在向操作系統(tǒng)申請內(nèi)存的時候,一般都是多給一些的,用不滿就浪費了,沒什么大不了。

2018年7月23日 14:54
編輯回答
奧特蛋

地址相差0x20,并不是20個字節(jié),
0x20 = 32 bit(十進(jìn)制)=4 Byte
應(yīng)該是隔了32個比特位吧,也就是這個指針占4個字節(jié)的位置大小,合理的分配。
堆的分配和棧不同,堆是鏈?zhǔn)椒峙洌ǖ刂凡灰欢ㄟB續(xù)),棧是順序分配的(地址連續(xù))。因此,在你這里我感覺是碰巧了,其實堆的地址你是捉摸不透的,棧你倒是可以知道他們的大概。像蘿卜的答案里寫的,動態(tài)申請的時候會多分配,我感覺有點不妥。像是更高級的vector,倒是這樣實現(xiàn)的,不過機(jī)器就是機(jī)器,你申請多少,他就給你多少。

以上是個人意見,多多交流!

2018年3月12日 15:32