0

我有一个关于变量范围或生命周期的问题,让我用一个例子来解释我的问题。下面的代码,我创建了一个局部变量 c 并返回它。在 main() 函数中a=foo(),我认为由于 c 是局部变量并且函数 foo() 已完成,因此变量 c 的内存单元应该已被破坏,变量 a 应保持垃圾值。但它保持 1 . 我哪里错了有没有人可以帮助我?提前致谢。

#include <stdio.h>
int foo()
{
    int c=1;
    return c;
}


int main()
{
    int a;
    a=foo();
    printf("%d",a);
    return 0;
}
4

7 回答 7

1

它基本上是一个函数激活记录,它将被推送到系统堆栈上,当你的函数返回时,它会首先将所有值复制到返回结果区域,也就是 a=foo(); 然后它会从系统堆栈中销毁该功能激活记录,我希望它会有所帮助

于 2013-08-06T11:56:32.027 回答
0

没有必要把它的价值变成垃圾。在函数崩溃分配的内存被释放但其值保持不变后,它不会用另一个垃圾值覆盖值。

于 2013-08-06T11:55:00.847 回答
0

foo函数返回后,对象c被销毁。在 return 语句中,c对象被评估并返回其值。您返回的不是c对象,而是c.

于 2013-08-06T11:55:15.230 回答
0

return c;它将 c 复制到一个临时值。然后将临时值复制到一个

于 2013-08-06T11:56:24.363 回答
0

当函数完成时,c 的内存确实被破坏了,但是函数返回 1 并且那个 1 被放入了a. 该值被复制到内存中a

但是,例如,下一个示例将不会保存该值:

#include <stdio.h>
int foo(int a)
{
    int c=1;
    a = c;
}


int main()
{
    int a = 0;
    a=foo();
    printf("%d",a);
    return 0;
}

将打印“0”

于 2013-08-06T11:57:08.527 回答
0

我认为由于 c 是一个局部变量并且函数 foo() 已完成,因此变量 c 的内存单元应该已被破坏

是的,这很可能会发生。

但是,您的函数返回一个value,在本例中为 1 的值c
因此,无论变量c被释放,该值被返回,它都不会丢失或释放。

然后将该值存储在a其中,这就是为什么a= 1。

于 2013-08-06T11:57:45.547 回答
0

哎呀,我在第一次回复中误解了你的问题。实际上,当您从任何函数返回时,汇编代码中有一些规则。

所以它将值复制到内部寄存器中,然后将该寄存器的值复制到a中。

于 2013-08-06T12:07:05.680 回答