函数作用域结束后内存中局部变量的持久性?

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

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

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


return result; 不返回result的变量,它返回的 result变量。 所以当函数返回时result很好,我们需要的只是它的值。

返回值通常放在寄存器中而不是堆栈中,但可能会在某些体系结构中被压入堆栈。 这个关于cdecl调用风格的页面给出了一个很好的概述。 请注意,细节因调用约定和平台而异。

但关键点仍然是第一段:调用者收到的result的价值result不是result


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

一切都是特定于实现的,但您可以假设调用result = sum(myValueOne, myValueTwo); 函数看起来这样(当然这是一个谎言:)):

  • 复制myValueOne值以注册
  • myValueTwo值复制到其他寄存器
  • 跳转到功能
  • 使用在寄存器中传递的值执行函数。
  • 将结果复制到寄存器
  • 回到函数被调用的地方
  • 将值从寄存器复制到result变量
  • 你可以在下面的例子中看到它更好:

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

    你对变量的范围是正确的。 这里你是错误功能的例子:

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

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

    干杯,米科拉杰


    有一个问题在内存中我的变量存储在c中? 它说明事物如何存储在计算机中,因此局部变量存储在堆栈中,全局变量存储在数据中

    链接地址: http://www.djcxy.com/p/82493.html

    上一篇: Persistence of local variables in memory after end of function scope?

    下一篇: Static scoping in C/C++