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

Address ordering in static, stack and heap memory allocation?

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

这是我的代码:

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

我得到的结果是:

这不是我所期望的1,因为堆栈上的地址应该从大变小。

我在这里误解了什么?


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

64位Windows7、Microsoft Visual C++ 2010

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