嵌入式学习第十五天!(内存管理、链表)

1. 内存管理:

    1. malloc 

void *malloc(size_t size);

    功能:申请堆区空间

    参数:size:申请堆区空间的大小

    返回值:返回获得的空间的首地址,失败返回NULL

    2. free

void free(void *ptr);

    功能:释放堆区空间

    注意:

        1.free只能释放堆区空间

        2. 一个空间只能被free一次,对此free程序会崩溃

        3. malloc需要和free搭配使用,如果只有malloc没有free会内存泄露

    练习:要求申请堆区空间,将“hello world”存放到堆区空间,完成打印

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main(void)
{char *p = NULL;p = malloc(16);if(p == NULL){printf("failed\n");return -1;}strcpy(p, "Hello World");printf("%s\n",p);free(p);return 0;
}

2. 内存溢出:

    内存溢出也称为内存越界

3. 内存泄露:

    程序中malloc的空间没有被释放

4. 内存碎片:

    由于频繁申请和释放,导致连续的空间分散成一些小的碎片空间,当malloc超过碎片空间时,则无法获得该空间(空间不连续),将这样的空间称为内存碎片

1. 链表

        1. 链表的构建

typedef int DataType;typedef struct node
{DataType Data;struct node *pNext;
}LinkNode;LinkNode *CreateLinkList(void)
{LinkNode *pTmpNode = NULL;pTmpNode = malloc(sizeof(LinkNode));if(pTmpNode == NULL){return NULL;}pTmpNode->pNext = NULL;return pTmpNode;
}

        2. 链表的插入(头插法)

int InsertHeadLinkList(LinkNode * phead, DataType TmpData)
{LinkNode *pTmpNode = NULL;pTmpNode = malloc(sizeof(LinkNode));if(pTmpNode == NULL){return -1;}pTmpNode->Data = TmpData;pTmpNode->pNext = phead->pNext;phead->pNext = pTmpNode;return 0;
}

        3. 链表的输出

int ShowLinkList(LinkNode *phead)
{LinkNode *pTmpNode = NULL;pTmpNode = phead->pNext;while(pTmpNode != NULL){printf("%d ",pTmpNode->Data);pTmpNode = pTmpNode->pNext;}printf("\n");return 0;
}

        4. 链表值的替换

int ReplaceData(LinkNode *phead, int OldData, int NewData)
{LinkNode *pTmpNode = NULL;pTmpNode = phead->pNext;while(pTmpNode != NULL){if(pTmpNode->Data == OldData){pTmpNode->Data = NewData;}pTmpNode = pTmpNode->pNext;}return 0;
}

        5. 链表删除某个值

int DeleteLinkList(LinkNode *phead, DataType DeleteData)
{LinkNode *pPreNode = NULL;LinkNode *pTmpNode = NULL;pTmpNode = phead->pNext;pPreNode = phead;while(pTmpNode != NULL){if(pTmpNode->Data == DeleteData){pPreNode->pNext = pTmpNode->pNext;free(pTmpNode);pTmpNode = pPreNode->pNext;}else{pTmpNode = pTmpNode->pNext;pPreNode = pPreNode->pNext;}}
}

        6. 链表的释放

int DestoryLinkList(LinkNode **pphead)
{LinkNode *pTmpNode = NULL;LinkNode *pFreeNode = NULL;pTmpNode = pFreeNode = *pphead;while(pTmpNode != NULL){pTmpNode = pTmpNode->pNext;free(pFreeNode);pFreeNode = pTmpNode;}*pphead = NULL;return 0;
}

作业:

        1. 封装函数在链表中实现尾插法

#include <stdio.h>
#include <stdlib.h>typedef int DataType;
typedef struct node
{DataType Data;struct node *pNext;
}LinkList;LinkList *CreatLinkList()
{LinkList *pTmpNode = NULL;pTmpNode = malloc(sizeof(LinkList));if(pTmpNode == NULL){return NULL;}pTmpNode->pNext = NULL;return pTmpNode;}int InsertTailLinkList(LinkList *pHead, DataType NewData)
{LinkList *pTmpNode = NULL;LinkList *pPotNode = NULL;pPotNode = pHead;pTmpNode = malloc(sizeof(LinkList));if(pTmpNode == NULL){return -1;}pTmpNode->Data = NewData;pTmpNode->pNext = NULL;while(pPotNode->pNext != NULL){pPotNode = pPotNode->pNext;}pPotNode->pNext = pTmpNode;return 0;}int ShowLinkList(LinkList *pHead)
{LinkList *pTmpNode = NULL;pTmpNode = pHead->pNext;while(pTmpNode != NULL){printf("%d ", pTmpNode->Data);pTmpNode = pTmpNode->pNext;}printf("\n");return 0;
}int DestoryLinkList(LinkList **pphead)
{LinkList *pTmpNode = NULL;LinkList *pFreeNode = NULL;pTmpNode = pFreeNode = *pphead;while(pTmpNode != NULL){pTmpNode = pTmpNode->pNext;free(pFreeNode);pFreeNode = pTmpNode;}*pphead = NULL;return 0;
}int main(void)
{LinkList *linklist = NULL;linklist = CreatLinkList();InsertTailLinkList(linklist, 1);InsertTailLinkList(linklist, 2);InsertTailLinkList(linklist, 3);InsertTailLinkList(linklist, 4);InsertTailLinkList(linklist, 5);ShowLinkList(linklist);DestoryLinkList(&linklist);
}

        2. 从终端接收一个字符,将字符串倒置后输出(用指针的方法):

                “how are you”  >  "you are how"

#include <stdio.h>int Reverse(char *pstr)
{char *phead = NULL;char *ptail = NULL;char tmp = 0;phead = ptail = pstr;while(*ptail != '\0'){ptail++;}ptail--;while(phead < ptail){tmp = *phead;*phead = *ptail;*ptail = tmp;phead++;ptail--;}return 0;
}int ReverseStr(char *pstr)
{char *phead = NULL;char *ptail = NULL;char *tmp1 = NULL;char *tmp2 = NULL;char tmp = 0;Reverse(pstr);phead = ptail = pstr;while(*pstr != '\0'){while(*ptail != ' ' && *ptail != '\0'){ptail++;}ptail--;tmp1 = phead;tmp2 = ptail;while(tmp1 < tmp2){tmp = *tmp1;*tmp1 = *tmp2;*tmp2 = tmp;tmp1++;tmp2--;}if (*ptail != '\0'){ptail = ptail + 2;phead = ptail;}else{break;}}}int main(void)
{char str[32] = "how are you";ReverseStr(str);printf("%s\n",str);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/658987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信效度检验2(SPSS

目录 1.效度介绍&#xff1a;2.效度检验&#xff1a;小结&#xff1a; 1.效度介绍&#xff1a; 用于研究题项设计是否合适 2.效度检验&#xff1a; 点击 降维->因子 把涉及到因变量的问题放入即可&#xff1a; 勾选&#xff1a; 得到输出结果&#xff1a; KMO值 0.7…

如何使用wireshark解析二进制文件

目录 目录 1.将已有的packet raw data按照下面格式写入文本文件中 a. Raw IP packet b. Ethernet packet 2.用wiershark导入hex文件 3.设置对应的packet类型 a. Raw IP packet b. Ethernet packet 1.将已有的packet raw data按照下面格式写入文本文件中 a. Raw IP pac…

汽车燃油泵数据分析:全球市场的年复合增长率将达到10%左右

燃油泵是汽车配件行业的专业术语。是电喷汽车燃油喷射系统的基本组成之一&#xff0c;位于车辆油箱内部&#xff0c;燃油泵在启动和发动机运转时工作&#xff0c;如果发动机停止而点火开关仍处于ON时&#xff0c;HFM-SFI控制模块关闭燃油泵的电源&#xff0c;以避免意外点火。 …

OpenCV与机器学习:使用opencv实现KNN

使用opencv实现KNN 前言OpenCV实现KNN生成随机数据使用matplotlib绘制数据OpenCV用于KNN训练生成新数据并观察预测 前言 KNN算法&#xff0c;即K-Nearest Neighbor&#xff0c;是一种简单的机器学习算法。它的基本思想是&#xff1a;如果一个样本在特征空间中的K个最相似&…

标注数据集 --labelimg

前言&#xff1a;我们想要训练自己的数据集时&#xff0c;通常需要自己标注数据集。无论是标注成yolo可识别的txt格式还是voc数据集的xml格式。使用labelimg标注都是一个不错的选择。 下面我们就从创建环境&#xff0c;使用labelimg进行标注两个方面来说明。 1.创建labelimg环境…

ADI 配合 USRP 使用的相控阵天线 cn0566

相控阵天线 在这里插入图片描述

Python实战:爬取微博,获取南京地铁每日客流数据

在这篇文章中&#xff0c;我们将使用 Python 进行网络爬虫&#xff0c;爬取微博上的南京地铁每日客流数据。 一、分析网页 在“南京地铁”微博主页搜索“昨日客流”关键词&#xff0c;搜索到每天发布的昨日客流数据。 “南京地铁”微博主页地址https://weibo.com/u/26382762…

基于视觉的移载协作机器人机床上下料末端纠偏算法

摘 要 针对复合机器人在机床上下料中的定位方法,本文主要关注识别机床卡盘和末端作业面的定位。首先分 析了复合机器人在机床上下料过程中的工作原理及其基本结构,包括 AGV (自动导引车)和协作机器人 的功能及特点。然后,详细阐述了如何使用视觉系统和纠偏算法来…

京东采销急眼,隔空喊话“针对”拼多多,焦虑之下为哪般?

农历新年将至&#xff0c;无论是线下各大商超还是线上电商平台&#xff0c;皆为年终大促而“忙的不亦乐乎”&#xff0c;尤其是近期发生的京东采销人员在直播间向拼多多喊话&#xff0c;“恳请拼多多停止屏蔽&#xff0c;恳请拼多多直接比价”&#xff0c;更是将年底这场朴实无…

flink cdc,standalone模式下,任务运行一段时间taskmanager挂掉

在使用flink cdc&#xff0c;配置任务运行&#xff0c;过了几天后&#xff0c;任务无故取消&#xff0c;超时&#xff0c;导致taskmanager挂掉&#xff0c;相关异常如下&#xff1a; 异常1&#xff1a; did not react to cancelling signal interrupting; it is stuck for 30 s…

ElasticSearch基础用法

什么是ElasticSearch? Elasticsearch是一个开源的、分布式的、实时的搜索和分析引擎。它允许用户近乎实时地存储、检索大量数据&#xff0c;并能够高效地对其进行全文搜索、聚合和分析。 部署ES和Kibana 通常采用docker-compose部署ES&#xff08;ElasticSearch&#xff09;服…

寒假思维训练day17 C. Equal Frequencies

不知不觉已经过了差不多一个月了&#xff0c;坚持一件事情还是有点收获的&#xff0c;今天更新一道1600的构造。 寒假训练计划day17 摘要&#xff1a; Part1 题意 Part2 题解 (有数学推导&#xff0c;latex形式) Part3 代码 (C版本&#xff0c;有详细注释) Part4 我对构造题…

基于YOLOv7算法的高精度实时安全帽和背心目标检测系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法的高精度实时安全帽和背心目标检测系统可用于日常生活中检测与定位安全帽和安全背心&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标…

【电子科技大学】计算机高级图形学总复习

第一章&#xff1a;绪论 图形学和图像学 走样的原因和反走样 走样指的是&#xff1a;用离散量表示连续量引起的失真 反走样&#xff1a;为了提高图形的显示质量&#xff0c;需要减少或消除因走样带来的阶梯形或闪烁的效果&#xff0c;用于减少或消除这种效果的方法称为反走样…

【51单片机Keil+Proteus8.9】门锁控制电路

门锁控制电路 二、设计思路 电路设计 1.电源部分&#xff1a;使用BATTERY为整个电路提供电源&#xff0c;可以在电路中加入一个电 源开关&#xff0c;以便控制电源的开启和关闭。 2.处理器部分&#xff1a;使用AT89C51芯片作为主处理器&#xff0c;通过编写程序实现门锁的 …

《Lua程序设计》-- 学习9

迭代器和泛型for 迭代器和闭包 迭代器&#xff08;iterator&#xff09;是一种可以让我们遍历一个集合中所有元素的代码结构。在Lua语言中&#xff0c;通常使用函数表示迭代器&#xff1a;每一次调用函数时&#xff0c;函数会返回集合中的“下一个”元素。 一个闭包就是一个…

SD-WAN有哪些组网方式?

随着企业网络需求的不断增长和变化&#xff0c;SD-WAN作为一种先进的网络架构技术&#xff0c;提供了多种灵活的组网方式&#xff0c;以适应不同企业的需求。本文将介绍SD-WAN常见的几种组网方式&#xff0c;帮助企业更好地理解如何利用SD-WAN构建高效的网络。 1、点对点&#…

离线使用Element UI和Vue

需要依赖如下&#xff1a; 1.vue.js; 2.index.js(Element UI) 3.index.css(Element UI) 4.element-icons.ttf(Element UI字体) 5.element-icons.woff(Element UI图标) 下载链接如下&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1nGOi0Vm_xExRGmVp6oVLoA 提取…

【笔记】React-Native跟Android交互--简单示例

/** * 使用命令 npx react-nativelatest init DemoRN创建项目 * * "react": "18.2.0", * "react-native": "0.73.2" * * 官网有详细教程&#xff1a;https://reactnative.dev/docs/native-modules-android */ 一、RN invoke androi…

【读点论文】SPTS Single-Point Text Spotting

SPTS Single-Point Text Spotting ABSTRACT 现有的场景文本识别(即&#xff0c;端到端文本检测和识别)方法依赖于昂贵的边界框注释(例如&#xff0c;文本行&#xff0c;词级或字符级边界框)。我们首次证明&#xff0c;训练场景文本识别模型可以通过对每个实例的单点进行极低成…