我对变量的范围或生命周期有疑问,让我用一个例子来解释我的问题。下面的代码,我创建了一个局部变量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;
}
答案 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)
所以它复制内部寄存器中的值,然后将该寄存器的值复制到。
中