C 语言内存分区 您所在的位置:网站首页 操作系统动态分区分配算法 C 语言内存分区

C 语言内存分区

2023-06-11 16:29| 来源: 网络整理| 查看: 265

C 语言内存分区 1. 内核空间2. 栈区3. 内存映射段4. 堆区5. 数据段1. .bss 段:2. .rodata 段:3. .data 段: 6. 代码段7. 对内存分区的验证

在这里插入图片描述

1. 内核空间

内核空间不在C语言内存分区中, 内核空间是操作系统内核运行的区域,其地址空间通常是高端地址,只有操作系统内核才能访问。在内核空间中,操作系统可以直接访问硬件资源和系统内存,执行特权指令,管理进程和线程等。

2. 栈区 栈区是由操作系统自动分配和释放的用于存储函数的局部变量、函数参数以及返回地址等信息栈的地址是从高地址往低地址增长的, 但是注意在一块开辟出的栈区内部地址是从小到大的, 比如, 开辟了两个数组, 第一个开辟的地址为 arr1 == 0x00006666, 那么第二个数组的起始位置就要比第一个的小, 比如 arr2 == 0x00006000, 但是数组内部的地址是从小往大的, 比如第二个数组中第一个元素 &arr2[0] == 0x00006000, 那么这个数组中其他位置的元素就比第一个元素的地址大, 比如 &arr2[1] == 0x00006004后进先出的,每次函数调用时,其参数和返回值都会被压入栈中,当函数执行完毕后,这些数据会自动从栈中弹出 3. 内存映射段

用于映射文件到虚拟内存地址空间中,从而可以直接读写文件。内存映射段也叫作"文件映射",它是将磁盘上的文件映射到进程的地址空间中的一种方式,让进程可以像访问内存一样访问文件。

当一个文件被映射到内存映射段时,文件的内容就被复制到一个虚拟地址空间中,并分配一个虚拟内存地址范围。这个虚拟地址空间可以被当作一个缓存来使用,所有对该文件的读写操作都可以在其中进行,从而避免了频繁的系统调用。

对于大型文件而言,内存映射文件可以大大加快文件的读写速度,提高了系统性能。但是内存映射文件也有一些限制,比如需要足够的虚拟内存空间,否则不能映射整个文件。此外,文件映射还存在一些安全风险,比如可以借助内存映射漏洞获取系统敏感信息等。

4. 堆区

注意这里的堆指的是一块内存, 与数据结构中的堆没关系

通常存储动态分配的内存块,如对象、数组、结构体等堆中的内存需手动申请和释放, 若不手动释放否则会造成内存泄漏, 可以通过 malloc(), realloc(), calloc() 函数进行申请, 通过 free() 函数, 并将对应的指针置空(不置空, 可能造成野指针)进行释放 5. 数据段

根据储存的变量不同, 数据段又可以分为三个段

1. .bss 段:

存放没有初始化的和初始化为0的全局变量或者 static 修饰的变量

2. .rodata 段:

read only, 即只能读, 用来存放一些只读常量, 如字符串, const 修饰的变量 注意, 有的常量放在代码段中, 这样可以保证常量数据的安全性和不变性,同时也可以减少内存的使用, 还可以方便程序运行时直接访问这些常量数据

3. .data 段:

存放初始化过(非零)的非const的全局变量或者 static 修饰的变量

(正是因为被 static 修饰过的变量放在了数据段内, 所以对应变量的声明周期变为全局, 但是作用域并不变) 这三个段, 大小端不同的机器, 对应的地址段的高低顺序也不一样

6. 代码段

用来存储程序的执行代码,是一个只读的区域,存储着可执行文件的二进制代码。在程序运行时,操作系统会将代码段的内容加载到内存中,并开始执行。

7. 对内存分区的验证

在这里插入图片描述

以上就是我对C语言内存分区的简单介绍, 希望能帮到你, 评论区欢迎指正!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有