我正在尝试编写一个程序,显示在静态,堆栈或堆内存中分配的连续变量的地址。
这是我的代码:
#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位Windows 7,Microsoft Visual C ++ 2010
答案 0 :(得分:4)
你误解的只是当堆栈在x86,x86-64和许多其他现代处理器上向下增长时,数组被分配为单个块,因此增加索引会增加地址。一旦记住这一点,你的结果就是人们所期望的。