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


例如

,如果我有一个小函数:

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

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

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

返回值通常放在寄存器而不是堆栈中,但在某些体系结构中可能会推送到堆栈上。这个关于 cdecl 调用样式的页面给出了一个很好的概述。请注意,详细信息因调用约定和平台而异。

但关键点仍然是第一段:调用者接收的是result的值,而不是result

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

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

  1. 复制myValueOne值进行注册
  2. myValueTwo值复制到其他寄存器
  3. 跳转到函数
  4. 使用寄存器中传递的值执行函数。
  5. 复制结果以注册
  6. 回到调用函数的位置
  7. 将值从寄存器复制到变量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;
}

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

干杯米科拉伊

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

最新更新