IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 内存之管理 -> 正文阅读

[数据结构与算法]内存之管理

内存管理

前言:为何进行内存管理?
程序运行时,需要将数据存放在内存空间中给程序使用。在软件开发中,常需要动态分配和撤销内存空间,例如对动态链表中的结点进行插入和删除,就需要对内存进行管理。

目录:
1.内存的组织方式
2.堆
3.栈

1.内存的组织方式

当我们编程好一个程序后,程序需要先转载进计算机的内存中,然后再被运行,程序被组织成4个逻辑段。
1.可执行代码
2.静态数据:可执行代码和静态数据,存储在固定的内存位置。
3.动态数据(堆):请求动态分配和释放的内存的内存池成为堆,也称为自由储存空间。
4.栈:局部数据对象、程序的参数、调用函数和被调用函数放在称为栈的内存池中。

2.堆

2.1malloc函数分配某一类型变量的内存空间

动态分配一段内存空间

int *p;              //首先定义一个整型指针来保存分配内存的地址。
p=(int*) malloc (sizeof(int));   //使用malloc分配大小为int(4个字节)的内存空间
*p=100              //使用该空间保存数据
printf("%d\n",*p);//输出数据  为100

malloc函数分配内存成功后会返回一个指针,因为分配的是一个int型空间,所以返回的也要是整型指针,所以我们要用(int* )进行强制类型转换,最后将函数返回的指针赋值给指针p,就可以保存动态分配的整型空间地址了。

2.2calloc函数动态分配连续内存空间数组。

这里用calloc函数分配一个数组,然后再用malloc函数分配一个数组,使得大家比较calloc函数和malloc函数的使用。

int *p;
p=(int*) calloc (3,sizeof (int));   //使用calloc动态分配一个长度为12个字符的整型数组
int *b;
b=(int*) malloc (sizeof(int[3]));  //使用malloc动态分配一个长度为12个字符的整型数组

malloc函数:不能初始化所分配的内存空间,在动态分配完内存后,里边数据是随机的垃圾数据。

calloc函数:能初始化所分配的内存空间,在动态分配完内存后,自动初始化该内存空间为零。

2.3realloc函数改变p指针指向空间大小

realloc函数的功能是改变指针指向大小为size的空间,设定的size可以是任意的,可以比原来大,也可以比原来小,返回值是指向一个新地址的指针,如果出现错误,则返回NULL。

int *t;
double *p =(double*) malloc (sizeof (double));  //利用malloc分配一个长度为8个字节的内存空间
t=realloc(p,size(int));       //p是指向分配浮点型的空间,使用realloc函数后改变p指向的空间大小。

p是指向分配浮点型的空间,使用realloc函数后改变p指向的空间大小,其大小设置为整型,然后改变后的内存空间地址返回赋值给t整型指针。

free函数内存回收

该函数的功能可以释放由 malloc()、calloc()、realloc() 等函数申请的内存空间。

int *p;              //首先定义一个整型指针来保存分配内存的地址。
p=(int*) malloc (sizeof(int));   //使用malloc分配大小为int(4个字节)的内存空间
free (p);            //释放该内存空间,释放内存空间后,想再输出*p时,将输出一个不可意料的值,因为这个数据已经不存在了

关于内存泄漏
在使用malloc等函数分配内存后,要对其使用的free函数进行释放,因为内存不进行释放会造成内存泄漏。例如当运行大型程序时,可能某个程序要重复使用一万次10MB的内存,那将使用100GB的内存,如果用free函数,那将只需要10MB。同时也有可能会有丢失内存的情况,这个不详细展开。

栈不需要像处理堆那样,在栈中显示分配的内存。当程序调用函数和申明变量时,系统将自动分配内存。
栈是一个后进先出的压入弹出式数据结构。在程序执行时,每次向栈中压入一个对象后,栈指针向下移动一个位置。当系统从栈中弹出一个对象时,最后进栈的对象将会被弹出,然后栈指针向上移动一个位置。如果栈指针位于栈顶,说明栈是空的,如果栈在栈底,说明栈式满的。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-11 12:57:43  更:2021-11-11 12:59:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:26:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码