标签:ret cal span 变量 clu 丰田 nbsp 编译 ips
返回本地变量的地址是危险的
返回全局变量或者静态本地变量的地址是安全的
返回在函数内 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
可以发现两个不同函数的本地变量竟然使用的是同一地址,这样也就说明了为什么返回本地变量的地址是不安全的,如果观察编译中生成的汇编代码可以发现,两个函数调用时堆栈指针指的是同一个堆栈内存。
多线程程序中全局变量可能会由于多个线程同时访问而出现错误。
标签:ret cal span 变量 clu 丰田 nbsp 编译 ips
原文地址:https://www.cnblogs.com/songbeyond/p/12507307.html