2015-12-26 197 views
3

我正在嘗試編寫一個程序,該程序顯示分配給靜態,堆棧或堆內存的連續變量的地址。靜態,堆棧和堆內存分配的地址排序?

這裏是我的代碼:

#include <iostream> 

void stack_f() { 
    // array on stack 
    char stack_arr[3] = {'a', 'b', 'c'}; 

    // stack memory addresses 
    std::cout <<"\nStack memory addresses.\n"; 
    for (size_t i = 0; i < 3; ++i) std::cout <<"&stack_arr["<< i <<"] " 
            << reinterpret_cast<void*>(&stack_arr[i]) <<'\n'; 
} 

//================================================================================ 
int main() { 
    // array on static storage 
    static char global_arr[3] = {'a', 'b', 'c'}; 

    // array on heap 
    char *heap_arr = new char[3]; 
    for (size_t i = 0; i < 3; ++i) heap_arr[i] = 'a' + i; 

    // Print addresses of the three arrays 

    // static memory addresses 
    std::cout <<"Static memory addresses.\n"; 
    for (size_t i = 0; i < 3; ++i) std::cout <<"&global_arr["<< i <<"] " 
            << reinterpret_cast<void*>(&global_arr[i]) <<'\n'; 
    // stack memory addresses 
    stack_f(); 

    // heap memory addresses 
    std::cout <<"\nHeap memory addresses.\n"; 
    for (size_t i = 0; i < 3; ++i) std::cout <<"&heap_arr["<< i <<"] " 
            << reinterpret_cast<void*>(&heap_arr[i]) <<'\n'; 
    delete [] heap_arr; 
    getchar(); 
} 

結果我得到的是:

enter image description here

這是不是我所期望,爲堆棧上的地址應該從大增長小。

我在這裏誤解了什麼?


1.我期待的位於靜態和堆內存從由小到大十六進制數變量的地址,而堆棧的地址以相反的順序增長。

64位Windows 7,微軟的Visual C++ 2010

+2

'&stack_arr [0]'相當於'stack_arr + 0','&stack_arr [1]'到'stack_arr + 1';即增加地址。 (如果數組在堆棧中,則不能將其索引爲「向後」索引,如果將數組分配到別處,則「向前」) - 訪問指針的所有代碼都需要有兩個特殊情況。)如果創建兩個數組並比較數組的地址,您將看到它們如您所期望的那樣。 – molbdnilo

+1

哪個編譯器?哪個平臺?兩者都是什麼版本?這與C++沒有太大的關係。 –

回答

4

你誤解了什麼是簡單的,而堆在x86,x86-64的,和其他許多現代處理器向下生長,數組分配作爲單個塊,因此增加索引增加地址。一旦記住你的結果是人們所期望的。

+0

每個數組都可以被看作是獨立的元素,對吧?所以,如果我調用函數(或包含另一個數組的不同函數)兩次,第二次調用的地址應該更小? – Ziezi

+1

這會中斷指針運算。指向堆的指針與指向堆棧的指針行爲不同?我們也不希望那樣,謝謝。 – LogicStuff

+1

@simplicis不,因爲堆棧在退出時被釋放。如果你調用它兩次,你可能會看到相同的地址。 –