C高级之内存管理(一)
我们写的C语言程序有数据和对数据进行操作的代码,数据又分为全局变量、局部变量、静态变量等。那C程序在运行的时候是如何区分和管理他们的呢?这就是C 语言的内存管理。
C 语言的内存管理的实质就是,将内存划分不同的区域,某段内存区域只会存储相应的数据。C语言对于内存空间的划分如下:
1) 代码段:这段区域主要用来存储编译后的函数体的二进制代码,字符串常量。该区域是只读的,如果试图对该区域进行改写,操作系统会报如下错误:
segmentation fault(core dumped)
2)data段:这个区域主要存储已初始化的全局变量、静态变量、一般常量。
3)BSS段:这个区域主要存储未初始化的全局变量、静态变量。
4)堆区:由程序员手动申请、手动释放回收。若程序员不手动释放,则在程序结束后由操作系统回收。所对应的函数是malloc()、calloc()、free()等。
5)栈区:由系统自动分配、自动释放回收,存放函数的参数值、局部变量等。
其中,堆区与栈区的内存是在程序执行时由系统分配的。当该程序需要分配内存时才会分配,不需要时不会分配(或者分配后直接回收)。而BSS区、数据区、代码区是在程序执行开始阶段就由编译器分配内存,这三个区域的内存在程序运行时会一直存在,不会被临时回收。
示例:
#include<stdio.h>
#include<stdlib.h>
int a = 0;//data段
char *p1;// BSS段
int main()
{
int b; //栈区
char s[] = "123456";//"123456"在栈区
char *p2;//栈区
char *p3 = "abcde";//"abcde"在代码段
static int c = 0;//data段
p1 = (char*)malloc(10);//堆区
*p3 = ‘A’;//"abcde"在代码段,所以不能改写,改写后出现segmentation fault(core dumped)段错误
return 0;
}