函数调用时局部变量在堆栈中的组织方式

how the local variable organized in stack when function call?

本文关键字:方式 堆栈 局部变量 函数调用      更新时间:2023-10-16

我运行以下代码:

    void func()
    {
        int i;
        int array[10];
        cout << &i << endl;
        for(int i = 0; i < 10; ++i)
        {
            cout << &array[i] << 'n';
        }
    }

输出为:

    0x28fe98
    0x28fe70
    0x28fe74
    0x28fe78
    0x28fe7c
    0x28fe80
    0x28fe84
    0x28fe88
    0x28fe8c
    0x28fe90
    0x28fe94

为什么i的地址是0x28fe98
我认为i的地址必须&array[0] - 4.
为什么i的地址实际上是&array[9] + 4

为什么 i 的地址是0x28fe98?

它位于阵列末尾之后

我认为 I 的地址必须是 &array[0] - 4。

为什么会这样?

为什么 i 的地址实际上是 &array[9] + 4?

因为i是在阵列:)之后

通常,元素被推送到堆栈上,它们的地址减少,而堆限制增加,但任何代码都不应该依赖于它,除非你处于低级别(asm 等)。