C语言指针作为函数返回值(附带实例)
在 C语言中,函数可以返回一个指针。当函数需要返回指针时,需要在函数声明和定义时将返回类型定义为相应的指针类型。
例如,如果要返回整数指针,则可以将函数定义为如下形式。
现在我们尝试让它返回一个指针到主调函数中:
这段程序虽然看起来是正确的,并且可以通过编译,但是存在潜在问题。这是因为在函数内定义的局部变量在函数执行完毕后会被销毁。因此,当函数执行完毕时,局部变量 n 的内存空间将被释放。再次访问它有可能正常,也有可能得到一些无意义的值或者引发错误。
这样设计的原因是函数与函数之间的变量是独立的,即使是同一个函数多次运行,这些变量也是独立的。在函数返回后,函数内的变量没有继续存在的意义。因此,函数内的变量将被回收,回收后的内存空间将给接下来运行的函数使用。
如果不想让变量被回收,那么可以在变量前加上关键字 static,用于返回静态局部变量的指针,例如:
现在函数 func() 结束后,变量 n 不会被回收,并且使用同一个地址的变量 n 重复调用 func() 函数。
因此,我们只需获取一次变量 n 的地址,即可观察到每次调用函数时,变量 n 都会自增。运行结果为:
例如,如果要返回整数指针,则可以将函数定义为如下形式。
int* func(参数列表);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 不会被回收,并且使用同一个地址的变量 n 重复调用 func() 函数。
因此,我们只需获取一次变量 n 的地址,即可观察到每次调用函数时,变量 n 都会自增。运行结果为:
101
102
103
104
105