return关键词可以从被调函数中返回一个值到主调函数。现在我们尝试让它返回一个指针到主调函数中。
#include <stdio.h> int* func()
{
int n = 100;
return &n;
}
int main()
{
int* p = func(); printf("%d\n", *p);
return 0;
}
我们在函数 func 中定义了变量n。接着, return &n 取得变量n的指针,并返回到main函数。
main函数收到返回值后赋值给p,并使用指针p来访问变量n。
这个程序看似正确,并且可以通过编译。但是,却存在潜在问题。
这是因为函数结束后,函数内部的变量也会被回收。所以,变量 n 已经失效了。再去访问它有可能正常,也有可能得到一些无意义的值或者引发错误。
这样设计的原因是因为函数与函数之间的变量是独立的,即使是同一个函数多次运行,这些变量也是独立的。在函数返回后,函数内的变量没有继续存在的意义了。所以,函数内的变量将被回收,回收后的内存空间将给接下来运行的函数使用。
如果你不想让变量被回收,那么可以在变量前加上关键词 static 。
#include <stdio.h>
int* func()
{
static int n = 100; // 关键词static让变量n不被回收
n++; // 变量n自增
return &n;
}
int main()
{
int* p = func();
printf("%d\n", *p);
func();
printf("%d\n", *p);
func();
printf("%d\n", *p);
func();
printf("%d\n", *p);
func();
printf("%d\n", *p);
return 0;
}
现在函数 func 结束后,变量n不会被回收了。并且,重复调用func函数,使用的是同一个地址上的变量n。
因此,我们只需获取一次变量n的地址,即可观察到变量n每次调用函数都被自增。