zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    HDU 6071
    HDU 6073
    HDU 2124 Repair the Wall(贪心)
    HDU 2037 今年暑假不AC(贪心)
    HDU 1257 最少拦截系统(贪心)
    HDU 1789 Doing Homework again(贪心)
    HDU 1009 FatMouse' Trade(贪心)
    HDU 2216 Game III(BFS)
    HDU 1509 Windows Message Queue(队列)
    HDU 1081 To The Max(动态规划)
  • 原文地址:https://www.cnblogs.com/hdu-2010/p/3619626.html
Copyright © 2011-2022 走看看