zoukankan      html  css  js  c++  java
  • 套路还在——MOOC视频的指针

    入职前就给安排了MOOC视频,其中看到了关于指针的几段。

    struct aa{
        int tmp;
    };
    
    struct aa* fun(aa* t)
    {
        struct aa tt = {100};
        t = &tt;
        return t;
    }
    
    
    int main(int argc, char *argv[])
    {
        struct aa *bb=new struct aa;
    
        aa* i=fun(bb);
    
        return 0;
    }

    main执行后,bb的tmp值是随机的,而i的tmp值是100.

    原因,bb作为指针传入,在函数fun内将tt的地址传给b,函数返回后,参数出栈,指针指向无变化。但是return相当于内存复制,把栈中tt的地址复制给了i。

    所以i的其实就是栈中的tt。

    以前从未想过如此return返回指针,不过发现倒也能用。最后仔细一想,实在太不安全。看下面的例子:

    struct aa* fun(aa** t)
    {
        struct aa tt = {100};
        *t = &tt;
        tt.tmp = 10;
        return *t;
    }
    
    
    int main(int argc, char *argv[])
    {
        struct aa *bb=new struct aa;
    
        aa* i=fun(&bb);
    
        return 0;
    }

    这个就很能说明问题了!

    首先(1):这样修改可以使得bb的值有意义。

    bb本是指针,将二级指针传入。再把tt的指针赋给参数(二级指针)的一级指针。待函数返回时,二级指针确实没有变化,不过二级指针的一级指针的指向发生在函数

    内部发生变化,这是可以的。所以bb的值有变化。

    不过重要的是(2):并不是100.

    这就是说在函数内部分配的的结构体tt。当我指针赋值后,如果修改了tt的tmp值,那么返回后的i和bb的tmp都发生了改变。

    不过,我也有一些不明白。tt是局部变量,应该在栈中,函数结束后难道不是应该出栈吗?为什么还是有值?指针指向它为什么没有问题?

    刚刚查了资料,补充一下。是因为堆栈空间没有销毁。所以如果我动态申请很多空间,则那个值就不一定了。

    int main(int argc, char *argv[])
    {
        struct aa *bb = new struct aa;
    
        aa* i = fun(&bb);
        int *nn = new int[1024 * 1024];
    
        return 0;
    }

    就是在fun函数后面分派一个很大的动态空间,再看i和bb都变了。

  • 相关阅读:
    c#调用c++动态链接库的问题
    “LC.exe”已退出,代码为 -1
    MVC部署到iis
    计算机上没有找到was服务
    无法查找或打开pdb文件
    用WCF服务来动态的获取本地XML省市区文档
    关于使用条码打印机指令打印汉字的问题
    关于SQL SERVER导出数据的问题!
    应用CLR的线程池
    所有的异常都要使用try catch 语句捕获?
  • 原文地址:https://www.cnblogs.com/wyc199288/p/6357478.html
Copyright © 2011-2022 走看看