#GO与C比较:指针函数返回局部变量地址的不同
##C语言函数中如何返回变量与指针?
在C语言中,一个函数可以直接返回函数中定义的局部变量,其实在函数返回后,局部变量是被系统自动回收的,因为局部变量是分配在栈空间,那为什么还可以返回局部变量,其实这里返回的是局部变量的副本(拷贝)。
#include <stdio.h>
int fun()
{
int a = 10;
return a; //返回的是a的副本
}
int main()
{
int b;
b = fun();
printf("%d\n", b);
}
$ ./a.out
10
如果将上面这个例子改成下面:
#include <stdio.h>
int *fun() //指针函数 (返回值是一个地址)
{
int a = 10;
return &a; //返回变量a的地址
}
int main()
{
int *b = NULL;
b = fun();
printf("%d\n", *b);
}
编译时会有警告:
main.c:14:12: warning: function returns address of local variable [-Wreturn-local-addr]
$ ./a.out
Segmentation fault (core dumped) //运行发生段错误
这里之所以发生段错误,是因为函数返回后,系统自动回收了函数里定义的局部变量,所以运行时去访问一个被系统回收后的地址空间,一定就会发生段错误,这是C/C++语言的特点。当然,也有办法让其不产生段错误,前面说过