C中变量的范围或生命周期

时间:2013-08-06 11:51:57

标签: c scope lifetime

我对变量的范围或生命周期有疑问,让我用一个例子来解释我的问题。下面的代码,我创建了一个局部变量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;
}

7 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分: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”

答案 5 :(得分:0)

  

我认为因为c是一个局部变量并且函数foo()已经完成,所以变量c的内存单元应该被销毁

是的,这可能发生了什么。

但是,您的函数返回,在本例中为1,值为c
因此,释放变量c,返回该值,不会丢失或释放。

然后将该值存储在a中,这就是a = 1的原因。

答案 6 :(得分:0)

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

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