程序结构之返回指针的函数

Posted songbeyond

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序结构之返回指针的函数相关的知识,希望对你有一定的参考价值。

返回指针的函数:

  • 返回本地变量的地址是危险的

  • 返回全局变量或者静态本地变量的地址是安全的

  • 返回在函数内 malloc 的内存是安全的,但是容易造成问题

  • 最好的做法是返回传入的指针

实例:

#include<stdio.h>
int* f(void);
void g(void);

int main(int argc,char const *argv[]) {
    int *p = f();
    printf("*p=%d
",*p);
    g();
    printf("*p=%d
",*p);
    return 0;
}

int* f(void) {
    int i = 12;
    printf("&i=%p
",&i);
    return &i;
}

void g(void) {
    int k = 24;
    printf("k = %d,&k = %p
",k,&k);
}

编译有警告提示返回了本地变量的地址:

 warning: function returns address of local variable

运行结果:

&i=0xffa5c044
*p=12
k = 24,&k = 0xffa5c044
*p=24

可以发现两个不同函数的本地变量竟然使用的是同一地址,这样也就说明了为什么返回本地变量的地址是不安全的,如果观察编译中生成的汇编代码可以发现,两个函数调用时堆栈指针指的是同一个堆栈内存。

Tips:

  • 不要使用全局变量来在函数间传递参数和结果
  • 尽量避免使用全局变量
    • 丰田汽车的案子(据说是使用了过多的全局变量)
  • 使用全局变量 和静态本地变量的函数是线程不安全的,或者是不可重入的,

多线程程序中全局变量可能会由于多个线程同时访问而出现错误。

 

以上是关于程序结构之返回指针的函数的主要内容,如果未能解决你的问题,请参考以下文章

C语言之函数指针用法总结

Android Java:在 onCreateView() 中返回空视图的片段

函数接受结构指针和返回结构指针有奇怪的行为?

结构体有啥特别之处?

05_指针之New()函数的使用

golang之结构体