- 函数运行结束后会销毁在它内部定义的局部数据,包含形参
- 这里所谓的销毁并不是将局部数据所占用的内存全部抹掉,而是程序放弃对它的使用权限,弃之不理,后面的代码可以随意使用这块内存
- 函数的返回指针尽量不要指向这些数据
- 返回变量值的时候,直接将局部变量的值传给了了寄存器eax,也就是说,函数返回以后,虽然局部变量已被释放,但是eax里面的还有一个值的拷贝。在函数结束返回时,将局部变量值拷贝给一个临时变量,然后将这个临时变量返回给调用函数。因此,即使局部变量在返回时已经释放内存,也不影响返回的变量值。
#pragma warning(disable:4996)
#include <stdio.h>
int* test(int a)
{
printf("形参地址:%x,值:%d\n", &a, a);//形参地址 : 10ff820, 值 : 10
return &a;
}
int main(int argc, char *argv[])
{
int a = 10;
printf("实参地址:%x,值:%d\n", &a, a);//实参地址:10ff900, 值 : 10
int* p = test(a);
printf("返回地址:%x,值:%d\n", p, *p);//返回地址 : 10ff820, 值 : 10
printf("改变函数栈内申请的变量a的值\n");
printf("返回地址:%x,值:%d\n", p, *p);//返回地址 : 10ff820, 值 : 5668392
system("pause");
return 0;
}
参考:
https://www.cnblogs.com/xbook-ben/archive/2019/05/22/10902299.html
http://c.biancheng.net/view/2015.html