c语言实现内存管理 csdn_c语言实现内存管理器

c语言实现内存管理 csdn_c语言实现内存管理器C语言——内存管理C语言目录:1. 概述2. 数据类型3. 量4. 运算符5. 流程控制6. 函数7. C程序编译过程8. 文件9. 内存管理9.1 进程空间程序(静态)&

C语言——内存管理
  C语言目录:

  1. 概述

  2. 数据类型

  3. 量

  4. 运算符

  5. 流程控制

  6. 函数

  7. C程序编译过程

  8. 文件

  9. 内存管理

  9.1 进程空间

  程序(静态):经编译后的可执行文件可以被多次执行

  进程(动态):程序在内存中的运行状态为进程

  在这里插入图片描述
9.1.1 栈内存(stack)

  栈中存放任意类型变量,但必须是 类型修饰符的局部变量

  随用随开,用完即销

  内存的分配和销毁由系统自动完成,不需要人工干预
栈内存的分配:从高地址到低地址,为变量分配的内容由 和 标记

  栈有最大存储空间限制,超出则引起栈溢出
如局部变量过多,过大或递归层数太多

  9.1.2 堆内存(heap)

  堆内存可以存放任意类型的数据,但需要自己申请与释放

  连续两次申请的内存可能不连续,但一定是从小地址开始分配内存

  9.2 变量内存分析

  9.2.1 变量存储过程

  一个变量所占用的存储空间,和 定义变量时声明的类型 以及 编译环境 有关
类型32位编译器64位编译器char11int44float44double88short22long48long long88void*48
a. 变量存储的过程
根据定义变量时声明的 和当前 确定需要开辟多大存储空间在内存中开辟一块存储空间,开辟时从内存地址大的开始开辟,将最小的地址返回给变量将数据保存到已经开辟好的内存空间内

  变量名:变量的首地址,是变量所占存储空间字节地址(最小的那个地址 )

  小端模式:数据的高字节高地址

9.2.2 内存读写操作

  在这里插入图片描述

  CPU在运行时要明确三件事:

  存储单元的地址(地址信息)

  通过地址总线找到存储单元的地址

  对部件的操作(读或写,控制信息)

  通过控制总线发出内存读写指令

  数据(数据信息)

  通过数据总线传输需要读写的数据
a. 写入过程
CPU 通过地址线将找到地址为 FFFFFFFC 的内存空间CPU 通过控制线发出内存写入命令,选中存储器芯片,并通知它,要其写入数据CPU 通过数据线将数据 12 送入内存 FFFFFFFC 单元中

  在这里插入图片描述
b. 读入过程
CPU 通过地址线将找到地址为 FFFF FFFC 的内存CPU 通过控制线发出内存读取命令,选中存储器芯片,并通知它,将要从中读取数据存储器将 FFFFFFFC 号单元中的数据 12 通过数据线送入 CPU寄存器中

  在这里插入图片描述

  9.3 数据存储区

  执行C语言程序,可用的存储区有

  程序区

  静态存储区:编译时分配内存;包括

  动态存储区:运行时分配内存;包括
9.3.1

  静态局部变量
仅在本函数中使用,调用后不清零只能赋一次初值,若不初始化 自动赋0或空字符可使用静态局部变量跟踪调用次数

  静态全局变量
仅限在定义的文件中使用,可使不同源文件中的静态全局变量独立
9.3.2

  在函数外部引用变量使用 ,扩充已定义的全局变量作用域

  一个C语言程序包含多个源程序,若使用同一外部变量,在一个源文件中定义,在另一个中用 说明是外部变量。引用外部函数时,被引用函数需添加

  9.4 动态分配内存

  9.4.1 malloc

  :在内存中申请一块连续的堆内存空间并返回,所申请的空间并未初始化

  size :表示要申请的字符数

  返回值:

  成功,返回非空指针,指向申请的空间

  失败,返回

  初始化方法: 字节初始化

  9.4.2 free

  : 释放通过 申请的堆内存空间,所以 和 总是成对出现

  9.4.3 calloc

  :在堆内存中申请 块长度为 的空间,申请的空间自动初始化为0
成功,返回非空指针指向申请的空间失败,返回

  9.4.4 realloc

  :扩充或缩小原有内存的大小

  参数

  :表示待扩容的空间指针

  :表示扩容后内存的大小

  返回

  成功:返回非空指针指向申请的空间

  失败:返回

  注意:

  当 时, 等同于

  返回的指针,可能与 原本的值相同,也可能不同

  相同:则原空间后后续空间充足

  不同:原空间后续内存空间不足,重新申请新的连续空间后,将元数据拷贝到新空间,原有空间会被自动释放

  9.4.5 应用——动态链表
a. 链表与静态链表

  链表:将零碎的内存空间组织为一组可用的内存空间

使用 申请内存空间时,若没有足够大的连续内存空间,则申请失败

  在这里插入图片描述

  静态链表:链表的长度固定,链表的结点固定

  在这里插入图片描述

  空链表

  头指针带了一个空链表结点,空链表结点中的 指向

  在这里插入图片描述

  静态链表数据存储在栈上,而栈的存储空间有限。所以要实现链表存储空间的动态分配,需要申请堆里的存储空间
b. 动态链表的创建
头插法

  涉及数据结构的线性表,可自行查看:https://auspicetian.life/posts/3975030669/

  尾插法

  c. 插入

  d. 销毁

2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/92063.html

(0)
上一篇 2024年 5月 30日 下午9:36
下一篇 2024年 5月 30日 下午10:02

相关推荐

关注微信