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;

}


猜你喜欢

转载自blog.csdn.net/weixin_42048417/article/details/80167555