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\n", a, &a);
7     a = 5;
8     printf("a = %d, &a = %p\n", a, &a);
9 }

 

main.c

#include <stdlib.h>
#include <stdio.h>

#include "test.h"



int main()
{
    printf("a = %d, &a = %p\n----------------\n", a, &a);
    f();
    printf("----------------\na = %d, &a = %p\n", 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

 

posted @ 2014-03-23 21:18  kongmeng  阅读(245)  评论(0编辑  收藏  举报