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

C++ 静态、堆栈和堆内存分配中的地址顺序?,c++,pointers,memory-address,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

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

这是我的密码:

#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();
}
#包括
void stack_f(){
//堆栈上的数组
字符堆栈_arr[3]={'a','b','c'};
//堆栈内存地址

std::cout您误解的是,当x86、x86-64和许多其他现代处理器上的堆栈向下增长时,阵列被分配为单个块,因此增加索引会增加地址。一旦记住这一点,您的结果就是预期的结果。

&stack\u arr[0]
相当于
堆栈arr+0
堆栈arr[1]
堆栈arr+1
;即增加地址。(如果数组在堆栈上,则不能“向后”索引;如果数组分配到其他位置,则不能“向前”索引–所有访问指针的代码都需要有两种特殊情况。)如果你创建两个数组,比较数组的地址,你会发现它们是你所期望的。哪个编译器?哪个平台?两者都是什么版本?这与C++没有什么关系。每个数组都可以看作是单独的元素,对吗?所以,如果我调用函数(或者包含另一个数组的不同函数)第二次调用的两倍地址应该更小?这会破坏指针算法。指向堆的指针的行为与指向堆栈的指针的行为不同?我们也不希望这样,谢谢。@simplicis否,因为堆栈在退出时被释放。如果调用两次,您可能会看到相同的地址。@Sami Kuhmonen正是您所说的:)@simplicisveritatis:如果您同时有两个对堆栈的调用(函数本身调用),那么您将得到不同的地址。如果您调用它,返回,然后再次调用,您将得到相同的地址。