2014-01-23 24 views
2

下面是一个简单函数的定义,它返回一个整数从函数返回值 - 为什么它有效?

int myFunc() 
{ 
    int localVar = 99; 
    return localVar; 
} 

,并在主称为

int main() 
{ 
    int y = myFunc(); 
    cout << y << endl; 
    return 0; 
} 

因为预计这工作。我想知道为什么? localVar是一个局部变量,它的值分配在堆栈中。一旦函数结束,它就会超出范围。所以,localVar将在通话中超出范围int y = myFunc();它/它为什么仍能够返回正确的值?

+3

那么,如果按照您的想法返回值,那么返回值的目的是什么?因为函数'int myFunc()'的返回类型,所以它会返回 – rullof

+1

。它允许你传回一个int值。变量'localVar'确实超出了'main()'的范围,但是localVar没有被使用,'y'是。 – ryyker

+0

该值不是在堆栈中返回,而是在寄存器 –

回答

6

您的函数返回值–的副本这就是“按值返回”的含义。
int y = myFunc();会将该值的字节从函数调用使用的临时位置复制到本地变量。

如果返回局部变量的地址它只会失败。

+1

中重写最后一句:或者是对局部变量的引用。 –

+2

“将复制值的字节” - 名义上。一旦优化器完成了它,情况可能看起来不同:-) –

+1

即使您确实返回了地址,它也可能不会失败。它会调用未定义的行为,这可能看起来工作得很好。 –

0

localVar不能在堆栈上产生。如果寄存器可用,它也可以使用。

如果它是在堆栈上创建事实,则该值被复制到寄存器反正上返回。

+1

这很好,但是一个寄存器比一个堆栈槽更加短暂。 – delnan

+0

@delnan我只是想指出,没有必要使用本地变量的堆栈。 – RedX

+0

一个很好的观点,它只是不回答这个问题:-) – delnan

0

因为return类型的功能的:int myFunc()。它允许你传回一个int值。变量localVar确实超出了main()中的作用域,但是localVar没有在那里使用,y是,并且当用作y = myFunc()时,它接受返回的int值。

2

有三件事情要注意的位置:

  • 对象localVar
  • myFunc
  • 对象y

是,localVar返回值超出范围在myFunc的末尾。但是,在此之前,其值将被复制到返回值myFunc(这就是return声明所做的)。然后,该返回值被复制到对象y中。没关系,localVar现在已经消失 - 你有它的副本。

这正是通过返回值一样。它将return语句中的表达式结果复制到返回值中。