例如,如果我有一个小功能:
int sum(int a, int b)
{
int result = a+b;
return result;
}
这里,result
是一个局部变量,根据我的理解,它应该只存在于函数的执行时间。该函数的调用者如何能够检索sum()函数的返回值,该函数只是局部变量result
的值?只是想知道函数内声明的局部变量的值是如何返回给调用函数的。我知道这发生在堆栈中,但我想知道它是如何发生的。
答案 0 :(得分:7)
return result;
没有返回result
变量,它会返回result
变量的值。因此,当函数返回时,result
消失是很好的,我们所需要的只是它的值。
返回值经常放在寄存器而不是堆栈中,但在某些体系结构中可能会被压入堆栈。 This page on the cdecl call style提供了一个很好的概述。请注意,详细信息因调用约定和平台而异。
但关键点仍然是第一段:它是result
的值,而不是result
,来电者会收到。
答案 1 :(得分:3)
您传递变量值,而不是变量。
通过这种方式,您可以直接传递值,例如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: %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?说明了如何在计算机中存储内容,因此局部变量存储在堆栈中,而全局变量存储在数据中