码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-03-16 23:59:35      阅读:120      评论:0      收藏:0      [点我收藏+]

标签: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

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

Tips:

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

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

 

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

标签:ret   cal   span   变量   clu   丰田   nbsp   编译   ips   

原文地址:https://www.cnblogs.com/songbeyond/p/12507307.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!