1. 程序代码区
程序代码区是用于存放程序执行代码的内存区域。这部分区域的大小在程序运行前就已经确定,它存储的是CPU执行的机器指令。程序代码区在程序启动时就被加载到内存中,且在整个程序运行期间都保持在内存中。
2. 文字常量区
文字常量区主要用于存放程序中的常量字符串。这些字符串在程序编译时就已经被分配好空间,并且在程序运行期间不会被改变。程序结束后,这些常量字符串所占用的内存由系统自动释放。形式如下:
const char* g_const_str = "hello, this is a constant string";
3. 静态存储区
静态存储区用于存放全局变量和静态变量。这些变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。静态存储区在程序启动时就被分配好空间,并且在整个程序运行期间都保持在内存中。程序结束后,这些变量所占用的内存由系统自动释放。形式如下:
int g_cnt = 10;
static int g_cnt = 10;
4. 栈区
栈区是用于存放函数的参数值和局部变量的值的内存区域。栈区的特点是先进后出,即最后一个被压入栈的元素会最先被弹出。栈区由系统自动分配和释放,程序员无需手动干预。形式如下:a,b,c就是存储在栈区。
void func()
{
int a, b, c;
...
}
5. 堆区
堆区是用于存放进程运行中被动态分配的内存段的内存区域。堆区的大小并不固定,可以动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上。堆区的内存由程序员手动分配和回收,如果不加以管理,容易造成内存碎片化。形式如下:
void fun()
{
char *p = (char *)malloc(1024);
...
free(p);
}