静态,堆栈和堆内存分配中的地址排序?

时间:2015-12-26 21:15:01

标签: c++ pointers memory-address

我正在尝试编写一个程序,显示在静态,堆栈或堆内存中分配的连续变量的地址。

这是我的代码:

#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 ,因为堆栈上的地址应该从大到小。

我在这里误解了什么?

1。我期望位于静态和堆内存中的变量地址从小到大的十六进制数增长,而堆栈的地址则以相反的顺序增长。

64位Windows 7,Microsoft Visual C ++ 2010

1 个答案:

答案 0 :(得分:4)

你误解的只是当堆栈在x86,x86-64和许多其他现代处理器上向下增长时,数组被分配为单个块,因此增加索引会增加地址。一旦记住这一点,你的结果就是人们所期望的。