文章目录
返回局部变量(或临时变量)的地址
1 返回局部变量
int sum(int a, int b)
{
int n = a + b;
return n;
}
int main()
{
int a = 10;
int b = 20;
int c = sum(a, b);
cout << c << endl;//30
return 0;
}
返回单一局部变量,可以通过寄存器传递函数返回值。
1.1 汇编解析
- sum函数
- main函数
2 返回局部变量的地址
typedef struct Node
{
int a;
int b;
int c;
}Node;
Node* Fun_0(int a, int b)
{
Node p = { 10,20 };
return &p;
}
int main()
{
Node* p = Fun_0(a, b);
return 0;
}
返回局部变量的地址,此时通过寄存器传递函数返回值,返回的是函数内部的局部变量的指针。但是函数结束后,临时/局部变量区的内存空间已经被释放,因此返回的是无效的野指针。
可以返回使用malloc创建的堆内存的指针,堆内存需要自行管理,函数结束后内存空间不会被系统释放。
2.1 汇编解析
- Fun_0函数
- main函数
3 返回局部结构体变量
typedef struct Node
{
int a;
int b;
}Node;
Node Fun(int a, int b)
{
Node p = { 10,20 };
return p;
}
int main()
{
Node q = Fun(a, b);
cout << q.a << endl;//10
cout << q.b << endl;//20
return 0;
}
返回结构体变量,结构体变量只有两个成员,也可以通过寄存器传递函数返回值。
3.1 汇编解析
- Fun函数
- main函数
4 返回局部结构体变量,超过两个成员
typedef struct Node
{
int a;
int b;
int c;
}Node;
Node Fun(int a, int b)
{
Node p = { 10,20,30 };
return p;
}
int main()
{
Node q = Fun(a, b);
cout << q.a << endl;//10
cout << q.b << endl;//20
cout << q.c << endl;//30
return 0;
}
返回结构体变量,结构体变量成员超过两个。
此时需要在传参的时候将main函数临时/局部变量区顶部地址压栈,在函数内部直接将返回值保存在main函数的临时/局部变量区。
4.1 汇编解析
- Fun函数
- main函数