代码:
#include <stdio.h>
#include <stdlib.h>
int* getStu(int x, int y)
{
int i = x+y;
return &i;
}
int main()
{
int x = 2, y = 3;
int *s = getStu(x, y);
printf("%d %d %d\n",x,y,*s);
return 0;
}
这段代码会崩溃,原因分析如下:
首先需要明确局部变量,是存放在栈空间上的,当一个函数被调用,会开辟一个栈空间,用来存储在这个函数中定义的局部变量,当函数返回后,栈空间会被释放掉,局部变量也就随之被释放掉
然后可以知道当在一个被调用的函数中声明一个局部指针变量,并让其作为这个函数的返回值,这个时候gcc编译会通过,但是运行时就会崩溃,原因就是使用了野指针,而这个野指针的产生原因就是因为局部变量指针返回的时候被释放掉了,指向了野指针,而在调用这个函数时使用了这个返回值,因此导致崩溃
解决办法:
1、将函数实现中的局部变量定义为static
2、将返回的值定义为全局变量
这样解决的原因是因为static变量与全局变量都是将数据存储到静态存储区上,不会因为函数返回而被释放掉