• 前两天困扰我的一个关于指针和内存的问题的总结


    #include <iostream>
    using namespace std;


    void fuck(int *&j)
    {
    int l = 20;
    int *k = &l;
    j = k;
    k = 0;
    }

    void any_function_use_local_variables()
    {
    int a, b, c;
    a=b=c=100;
    }

    int main()
    {

    int i = 10;
    int *j = &i;

    fuck(j);
    /////-------------------------
    cout < <*j < <endl;   
    ////-------------------------
    cout < <*j < <endl;

    any_function_use_local_variables();
    ////-------------------------
    cout < <*j < <endl;
    //
    cout < <*j < <endl;

    return 0;
    };


    打印结果,四次cout < <*j < <endl;结果都不同,依次是:
    20
    274148040
    -858993460
    274148040
    这个我开始就不太明白了,明明fuck了局部变量为什么还能得到20的值,j应当指向一块不确定的内存区域,却有了几次不一样的结果。
    于是在论坛里面贴了出来,自己也查了很多资料试验了很多程序。
    原因我的理解基本是这样:
    第一个输出时因为是刚刚返回 ,虽然局部变量销毁了.
    (我的理解销毁:就是我放弃了这个地方了.原来我在那放了一个苹果,在没人用这块地方时苹果还在)
    所以第一个输出还是20。之后这块内存应该被用过了,所以变成了其它的值。
    下面是一位牛人的回复,挺有道理!
    ///////////////////
    第一次输出:在void fuck(int *&j) 函数中,声明的局部变量K,假设地址为oxff71,在函数中,这个地址赋值给了j;
    然后,函数中的局部变量K所指的内存的值为20;然后,fuck函数结束,局部变量的内存被释放,单这个释放只是说明了这块内存可以被重新使用,并不是把内存里的数值归0了,所以。在第一次输出的时候,*j为20;

    第2次输出:其实cout < <也是调用了一个函数,这个函数怎么实现我并不知道,但是有理由相信,在这个函数中是要使用一些局部变量的,那么当第一次输出了*j以后,这个函数或许没有结束,它里面的局部变量使用了刚刚fuck释放的那块内存,然而又有局部变量使用了oxff71这个地址,但是变量J所指的地址也正好是这样,所以,输出了另一组数字。

    第3次输出:在调用了any_function_use_local_variables()这个函数后,其实我们可以把any_function_use_local_variables 这个函数简化下, 简化成下面这样
    void any_function_use_local_variables()
    {
    int a=10;
    int b =100;
    }
    通过代码跟踪调试可以知道,any_function_use_local_variables函数还是使用了fuck释放的内存,因为我们可以清楚的看到 b的地址是oxff71,所以第3次输出的就是100了。

    其实我们可以在3个cout < <*j < <endl以后在加一个 cout < <*j < <endl,可以看到第4个输出和第2个输出是一样的,从而就证明了我对第2次输出的猜想。
  • 相关阅读:
    安装Linux应用软件的五种基本方法
    gprof使用介绍
    Linux内核对象模型(subsystem,kset,kobject)
    kernel 目录 解析
    linux板级设备的初始化过程(转)
    Linux下I2C驱动程序的分析
    I2C总线设备驱动解析
    linux proc文件系统学习 (转)
    cscope的用法
    mvc3 Razor PartialView视图中Html.DropDownList用法
  • 原文地址:https://www.cnblogs.com/hellohuan/p/1256769.html
Copyright © 2020-2023  润新知