返回指针的函数:
- 返回本地变量的地址是危险的
- 返回全局变量或者静态本地变量的地址是安全的
- 返回在函数内 malloc 的内存是安全的,但是容易造成问题
- 最好的做法是返回传入的指针
实例:
#include<stdio.h> int* f(void); void g(void); int main(int argc,char const *argv[]) { int *p = f(); printf("*p=%d\n",*p); g(); printf("*p=%d\n",*p); return 0; } int* f(void) { int i = 12; printf("&i=%p\n",&i); return &i; } void g(void) { int k = 24; printf("k = %d,&k = %p\n",k,&k); }
编译有警告提示返回了本地变量的地址:
warning: function returns address of local variable
运行结果:
&i=0xffa5c044 *p=12 k = 24,&k = 0xffa5c044 *p=24
可以发现两个不同函数的本地变量竟然使用的是同一地址,这样也就说明了为什么返回本地变量的地址是不安全的,如果观察编译中生成的汇编代码可以发现,两个函数调用时堆栈指针指的是同一个堆栈内存。
Tips:
- 不要使用全局变量来在函数间传递参数和结果
- 尽量避免使用全局变量
- 丰田汽车的案子(据说是使用了过多的全局变量)
- 使用全局变量 和静态本地变量的函数是线程不安全的,或者是不可重入的,
多线程程序中全局变量可能会由于多个线程同时访问而出现错误。
原文地址:https://www.cnblogs.com/songbeyond/p/12507307.html
时间: 2024-10-12 14:01:46