zoukankan      html  css  js  c++  java
  • 程序结构之返回指针的函数

    返回指针的函数:

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

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

    • 返回在函数内 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:

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

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

  • 相关阅读:
    前端之HTML补充
    前端之HTML
    mysql 视图,触发器,存储
    mysql 函数 事务
    索引扩展
    mysql数据库索引相关
    mysql 存储过程查询语句
    mysql 单表查询
    mysql 多表连接查询
    js引入的几种简单写法
  • 原文地址:https://www.cnblogs.com/songbeyond/p/12507307.html
Copyright © 2011-2022 走看看