一、起源
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