#include<stdio.h>
int add(int,int);
int main()
{
int a;
a=add(5,7);
printf("%d",a);
}
int add(int x,int y)
{
x=x+y;
return(x);
}
Run Code Online (Sandbox Code Playgroud)
昨晚我对退货声明表示怀疑.see x是一个在add函数内定义的自动变量,并且ANSI表示存在一个auto变量,并且它的生命周期只在函数内部,但是这里return语句可以使变量a在函数外部存在.它存储价值在哪里?堆栈还是堆?
既不在堆栈上也不在堆上.
至少在x86架构中,函数的返回值通常被复制到eax寄存器中,因此它会在函数之外存在.这是为什么你不能返回一个数组而只是一个指向它的指针的原因之一.
但是,您可以按值返回结构和其他更大的变量,在这种情况下,编译器通过使用堆栈和其他寄存器(如edx.)来执行一些操作.
return实际做什么取决于编译代码的机器架构.在具有寄存器的机器上,将值x复制到寄存器.调用者将从那里获取值并对其执行某些操作.这里,该值被复制到一个名为的变量a.
如果在堆栈计算机上编译此代码,则返回值可能只留在堆栈本身上.调用该add函数的目标代码如下所示:
push 7
push 5
call add
seti 0x28ccf4
Run Code Online (Sandbox Code Playgroud)
add将弹出堆栈中的值,将它们添加到一起并将结果推回堆栈.(如果函数处理的数据结构无法找到堆栈中的插槽,则会推送它们的地址.)seti是一个操作,它将从堆栈中弹出一个值并将其分配给特定地址的整数变量.(这里0x28ccf4是地址a.).随着堆栈的顶部现在将包含增加的结果5和7,价值a将成为12.