思考下面代码,各种变量,数据放在哪块内存区域?
代码语言:javascript复制#include
#include
int GlobalVar=1;
static int StaticglobalVar1=1;
int main()
{
static int staticglobalVar2 = 1;
int partVar;
char arr[] = "abcdef";
int* str1 = (int*)malloc(sizeof(int) * 5);
int* str2 = (int*)malloc(sizeof(int) * 5);
if (str1 == NULL || str2 == NULL)
{
perror("malloc()");
return 1;
}
free(str1);
free(str2);
str2 = NULL;
str1 = NULL;
return 0;
} 让我们先来看看内存分为那几块区域:
1.内核空间:
(百度百科搜索)我觉得很有必要了解清楚。
Linux系统对自身进行了划分,一部分核心软件独立于普通应用程序,运行在较高的特权级别上,它们驻留在被保护的内存空间上,拥有访问硬件设备的所有权限,Linux将此称为内核空间。
相对地,应用程序则是在“用户空间”中运行。运行在用户空间的应用程序只能看到允许它们使用的部分系统资源,并且不能使用某些特定的系统功能,也不能直接访问内核空间和硬件设备,以及其他一些具体的使用限制。
将用户空间和内核空间置于这种非对称访问机制下有很好的安全性,能有效抵御恶意用户的窥探,也能防止质量低劣的用户程序的侵害,从而使系统运行得更稳定可靠。
也就是说,内核空间很高贵,不允许其他用户应用程序进行访问,只有核心软件才能有权限去访问内存空间,硬件设备。
2.栈区:
用来存放局部变量,函数参数。
3.内存映射段:
文件映射,动态库,匿名映射。
4.堆区:
存放动态内存(malloc,calloc,realloc函数申请的空间)。如果程序员不主动释放,由操作系统自动回收。
5.数据段(静态区):
存放全局变量,静态变量,常量。程序结束后,自动释放。
6.代码段:
存放函数体(内成员函数,全局函数)的二进制代码。