繁体   English   中英

多次调用的函数的堆栈帧每次都不同吗?

[英]Is the stack frame of a function called multiple times different each time?

void foo()
{
    int i;
    printf("%d",i++);
}

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

代码的输出是一系列 10 个随机但连续的数字。 我想知道如果每次都被初始化并且我的存储类也是自动的,这怎么可能?
foo() 的堆栈帧是在每次调用时再次分配还是相同的?

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

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

所以,

多次调用的函数的堆栈帧每次都不同吗?

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

======== 评论后编辑 ========
好吧,上面的句子包含一个形式错误。 堆栈帧不同是不正确的:调用之间可以相同(如果使用递归,则可能不会相同)。 但是,您无法确定它是否相同,因此您必须假设它每次都不同。 假设它是不同的,你就说明它是不同的,即使它不是真的。 除非你想利用一些神秘的算法......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM