函数调用时局部变量如何在堆栈中组织?

时间:2014-01-07 14:14:19

标签: c++

我运行以下代码:

    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

1 个答案:

答案 0 :(得分:5)

  

为什么i的地址是0x28fe98?

它位于数组结束后

  

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

为什么会这样?

  

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

因为i位于您的数组之后:)

通常,元素被推入堆栈并且它们的地址减少而堆限制增加但是没有代码应该依赖于它,除非你处于低级别(asm等等)。