【问题标题】:scope or lifetime of variable in CC中变量的范围或生命周期
【发布时间】:2013-08-07 09:57:35
【问题描述】:

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

【问题讨论】:

    标签: c scope lifetime


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢信息,所以我有点困惑,如果变量c的内存单元被破坏,值1怎么还存在?
      • 无法保证该内存块中有 1。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          函数执行时确实销毁了 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”

          【讨论】:

          • 那么,在销毁变量 c 的内存单元之前,将其中的值复制到 a 中?我说的对吗?
          • @Eday 你明白了。如果您想了解更多信息,可以反汇编您的项目,看看它是如何进行的。这些值实际上是放在堆栈中,并在返回时由调用从堆栈中取出
          • @Eday,几乎是对的。 c 的值保存在一个临时位置(称为堆栈),然后在 c 不再可用后将该临时位置复制到 a。有关此“堆栈”的更一般性讨论,请参阅 Google 上的“Push Down Pop Up Stacks”。
          【解决方案6】:

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

          是的,这很可能会发生。

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

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              猜你喜欢
              • 2012-06-23
              • 2015-09-26
              • 1970-01-01
              • 2011-02-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多