函数范围结束后内存中局部变量的持久性?

时间:2016-03-20 12:27:06

标签: c

例如,如果我有一个小功能:

int sum(int a, int b)
{
   int result = a+b;
   return result;
}

这里,result是一个局部变量,根据我的理解,它应该只存在于函数的执行时间。该函数的调用者如何能够检索sum()函数的返回值,该函数只是局部变量result的值?只是想知道函数内声明的局部变量的值是如何返回给调用函数的。我知道这发生在堆栈中,但我想知道它是如何发生的。

3 个答案:

答案 0 :(得分:7)

return result;没有返回result变量,它会返回result变量的。因此,当函数返回时,result消失是很好的,我们所需要的只是它的值。

返回值经常放在寄存器而不是堆栈中,但在某些体系结构中可能会被压入堆栈。 This page on the cdecl call style提供了一个很好的概述。请注意,详细信息因调用约定和平台而异。

但关键点仍然是第一段:它是result,而不是result,来电者会收到。

答案 1 :(得分:3)

您传递变量值,而不是变量。 通过这种方式,您可以直接传递值,例如sum(8)

所有内容都是特定于实现的,但您可以假设调用result = sum(myValueOne, myValueTwo);函数以这种方式查看(当然这是谎言:)):

  1. myValueOne值复制到注册
  2. myValueTwo值复制到其他注册
  3. 跳转到功能
  4. 使用寄存器中传递的值执行函数。
  5. 将结果复制到注册
  6. 回到功能调用的地方
  7. 将值从注册表复制到result变量
  8. 您可以在以下示例中更好地看到它:

    void increment(int a)
    {
       a++;
    }
    
    int main(void)
    {
       int a =7;
       increment(a);
    
       printf("My number is now: %d\n", a);  /* Will print 7 */
    
       return 0;
    }
    

    你对变量范围是正确的。在这里您可以看到错误的功能:

    int* increment(int a)
    {
       int b;
       b = a+1;
    
       return &b;
    }
    

    它返回指向(地址)局部变量的指针,当然它是错误的,因为在函数退出后该变量不存在。无论如何编译器在这种情况下应至少返回警告。

    干杯, Mikolaj

答案 2 :(得分:1)

有一个问题Where in memory are my variables stored in c?说明了如何在计算机中存储内容,因此局部变量存储在堆栈中,而全局变量存储在数据中