首页 > 编程笔记 > C语言笔记 阅读:16

C语言指针作为函数返回值(附带实例)

在 C语言中,函数可以返回一个指针。当函数需要返回指针时,需要在函数声明和定义时将返回类型定义为相应的指针类型。

例如,如果要返回整数指针,则可以将函数定义为如下形式。
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

相关文章