C程序将占用的内存分为几个段。当使用系统时,系统将根据程序规划堆栈,但是在裸机开发时,设置堆栈在汇编的启动文件中。在windows系统环境下,访问那些不能访问的区域将发生段错误。
内核空间 | 禁止访问 | 内核保留的空间 | |
栈区 | R/W | 局部变量 | |
堆区 | RW | 程序员自己申请和释放的空间 | |
静态存储区 | 全局数据空间 | RW | 存放全局变量(分初始化的和未初始化的) 未初始化的放在bss段,初始化放在data段。static修饰的局部变量也存放其中 |
只读数据段 | R | 存放常亮,包括字符串 | |
代码段 | R | 代码 |
静态存储区
这个空间的声明周期为整个程序的周期。
代码段:
存放代码的空间
只读数据段:
存放常量。
对于相同的常量只存放一份。
如果宏定义的常量想在其中存储必须使用过,光宏定义是不会存储的。
全局数据空间:
用于存放静态变量(全局变量与static修饰的局部变量)。
1:如果变量初始化,则存放在data段。
2:如果未初始化则存放在bss段。
堆区
自己申请与释放的空间,由程序员定义。
#include <stdio.h>
#include <stdlib.h>//内存管理函数相关头文件
int main()
{
int *p = 0;//创建堆区访问指针
p = (int*)malloc(100);//申请100字节的空间
p[3] = 32;
printf("dui = %d",p[3]);
free(p);//释放空间
}
关于堆区,一定要记得释放空间,尤其是销毁访问指针时,一定要确定空间已释放,否则很难访问到申请的空间。如果一个内存申请了但是没有使用或无法使用,这就是内存泄漏。
栈区
存放局部变量,先入先出,随着函数的进出对局部变量进行压栈和出栈。
注:GCC提供了查看程序内存占用的命令(size)与提取程序字符串的命令(strings)具体使用看我的博客vscode搭建c/c++环境章节。