每次调用的函数的堆栈框架是否多次不同?

问题描述 投票:0回答:1
void foo()
{
    int i;
    printf("%d",i++);
}

int main()
{
    int j;
    for(j=0;j<10;j++)
    {
        foo();
    }
}

代码的输出是一系列10个随机但连续的数字。我想知道如果每次都初始化i并且我的存储类也是auto时怎么办?还会在每次调用foo()时重新分配其堆栈框架吗?还是相同的堆栈框架?

c memory-management stackframe
1个回答
0
投票

auto变量不会自动初始化,它们包含垃圾。这些变量通常通过快速堆栈操作在堆栈中分配。在foo()中,您具有这样的变量,因此printf输出随机数据。

即使递归调用了foo()函数,自变量问题仍然存在,每次调用都会产生一个包含垃圾的新stack frame

所以,

每次调用的函数的堆栈框架是否多次不同?

是。除非您在该函数中使用static变量。但是然后,您将拥有保持其值不变的变量,但实际上它们始终是相同的(不再是“局部”变量,或者更好的是全局变量,但仅在该函数(作用域)中可见)。

========注释后编辑========好吧,以上句子包含一个形式错误。堆栈帧是否会不同是不正确的:调用之间can相同(如果使用递归,则可能不会相同)。但是,您不能确定它是相同,因此必须每次都假定它是不同的。通过假定它是不同的,即使它不是真的,您也可以声明它是不同的。除非您想利用某种奥术算法...

© www.soinside.com 2019 - 2024. All rights reserved.