• C/C++内存分配区


    一、起源
    C++内存分成5个区,分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
    但这个自由存储区这么一听还是模模糊糊的,和堆好像是一样的,还有同学说起这个问题。
     
    二、个人理解
    关于自由存储区和堆的区别,我是这样理解的
    (1)字面意思是“自由存储”区,那就是可以随便 malloc它,随后我们把malloc来的内存,想怎么用就怎么用,想存啥就存啥,反正最后别忘了free了就行了。这个区我理解成自由存储区,“自由”嘛。
    (2)堆区和栈区也算是它的转换过去的一部分,不过肯定不属于它,非要区分,那堆和栈可以在自由存储区上自由扩展,直到把它消耗完。
    (3)就是自由存储区嘛,就是我们可以“随便用”的那块嘛,就是“不是堆但我们可以随便用”它的那块。我联想的是:我们new从堆上操作,而堆再在自由存储区上去malloc扩展自己,相当于更底层一点。如果我们非要操作这个底层,那我们自己就malloc它。
    (4)我的再一个图形化的理解是:堆相当于一个内核,而自由存储区相当于一个底层的驱动。
     
     
     
    (5)都是用户来申请释放,认为相同也没啥问题。这也不是C++标准的规定,只是一个理论性的字面总结而已。
     
    大概理解就这么多,有什么错误的地方,还希望指正或对骂。
     
     
    2 变量的声明和定义
     
    test.h
    1 #ifndef _ATS_TEST_STA_
    2 #define _ATS_TEST_STA_
    3 #include <stdlib.h>
    4 #include <stdio.h>
    5 
    6 int a;  //声明
    7 void f();
    8 
    9 #endif

    function.c

    1 #include "test.h"
    2 
    3 
    4 void f()
    5 {
    6     printf("a = %d, &a = %p
    ", a, &a);
    7     a = 5;
    8     printf("a = %d, &a = %p
    ", a, &a);
    9 }

    main.c

    #include <stdlib.h>
    #include <stdio.h>
    
    #include "test.h"
    
    
    
    int main()
    {
        printf("a = %d, &a = %p
    ----------------
    ", a, &a);
        f();
        printf("----------------
    a = %d, &a = %p
    ", a, &a);
    
        system("pause");
        return 0;
    }
    输出结果
     
     
    • 修改头文件test.h为
    1 #ifndef _ATS_TEST_STA_
    2 #define _ATS_TEST_STA_
    3 #include <stdlib.h>
    4 #include <stdio.h>
    5 
    6 int a = 3; //定义
    7 void f();
    8 
    9 #endif

    编译错误:

    fatal error LNK1169: 找到一个或多个多重定义的符号

    • 修改头文件test.h为
    1 #ifndef _ATS_TEST_STA_
    2 #define _ATS_TEST_STA_
    3 #include <stdlib.h>
    4 #include <stdio.h>
    5 
    6 static int a = 3;  //修改为static
    7 void f();
    8 
    9 #endif

    要合适运用变量的声明、定义。

    参考资料

    1 C语言中的static 详细分析 http://blog.csdn.net/keyeagle/article/details/6708077

  • 相关阅读:
    毕设(五)ListView
    毕设(四)ListBox
    毕设(三)NotifyIcon
    hdu 1.2.3
    ZOJ 1789 The Suspects
    ZOJ 2833 Friendship
    git
    yum wget rpm
    上传绕过
    LAMP 和 LNMP
  • 原文地址:https://www.cnblogs.com/hdu-2010/p/3619626.html
Copyright © 2020-2023  润新知