C/C++内存分配区

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

function.c

 #include "test.h"

 void f()
{
printf("a = %d, &a = %p\n", a, &a);
a = ;
printf("a = %d, &a = %p\n", a, &a);
}

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 ;
}
输出结果
aaarticlea/png;base64,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" alt="" />
  • 修改头文件test.h为
 #ifndef _ATS_TEST_STA_
#define _ATS_TEST_STA_
#include <stdlib.h>
#include <stdio.h> int a = ; //定义
void f(); #endif

编译错误:

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

  • 修改头文件test.h为
 #ifndef _ATS_TEST_STA_
#define _ATS_TEST_STA_
#include <stdlib.h>
#include <stdio.h> static int a = ; //修改为static
void f(); #endif

aaarticlea/png;base64,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" alt="" />

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

参考资料

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