程序结构之返回指针的函数
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:
- 不要使用全局变量来在函数间传递参数和结果
- 尽量避免使用全局变量
- 丰田汽车的案子(据说是使用了过多的全局变量)
- 使用全局变量 和静态本地变量的函数是线程不安全的,或者是不可重入的,
多线程程序中全局变量可能会由于多个线程同时访问而出现错误。
以上是关于程序结构之返回指针的函数的主要内容,如果未能解决你的问题,请参考以下文章