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

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.hqwc.cn/news/443323.html

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

相关文章

【golang】13、viper 配置库 | 配置文件读写 | 使用方式 | 源码逻辑分析

文章目录 一、使用方式1.1 特性1.2 优势1.3 设置1.3.1 默认值1.3.2 配置文件1.3.3 写配置文件1.3.4 监听配置文件变化1.3.5 从 io.Reader 读配置1.3.6 Setting Overrides1.3.7 使用 Alias1.3.8 环境变量1.3.9 命令行 Flags1.3.8.1 Flag 接口 1.3.9 配置中心1.3.9.1 未加密1.3.9…

TypeScript Array(九) 数组

1.TypeScript Array 数组 1.1. 描述 数组对象是使用单独的变量名来存储一系列的值。  &emsp比如&#xff0c;你现在有一组数据&#xff0c;存单独变量如下&#xff1a; var data1"Android"; var data2"Java"; var data3"Harmony";那如果有…

网安人必看!CISP家族顶流证书攻略

网络安全已成为当今的热门领域&#xff0c;证书在职业发展中的重要性不言而喻。但是&#xff0c;证书市场五花八门&#xff0c;选择适合自己的证书可是个大问题。别担心&#xff0c;今天我们就来聊聊CISP家族的几个热门认证&#xff0c;让你在网络安全领域的发展更加顺利&#…

Redis -- 开篇热身,常用的全局命令

“我不能改变风向&#xff0c;但我可以调整我的帆船来到达我想去的地方。”——希腊哲学家亚里士多德 目录 Redis重要文件 启动停止脚本 配置文件 持久化文件存储目录 核心命令 set get 全局命令 keys exists del expire ttl 过期策略是如何实现的 定时器 type…

【mysql】InnoDB引擎的索引

目录 1、B树索引 1.1 二叉树 1.1.1 二分查找&#xff08;对半查找&#xff09; 1.1.2 树&#xff08;Tree&#xff09; 1.1.2.1 树的定义 1.1.2.2 树的特点 1.1.2.3 二叉树 1.1.2.4 二叉查找&#xff08;搜索&#xff09;树 1.2 B树 1.2.1 聚簇索引&#xff08;clust…

【开源学习】TB-gateway -- 基本配置与使用

【开源学习】TB-gateway -- 基本配置与使用 tb-gateway 安装部署centOS 7 安装&#xff08;不推荐&#xff09;Docker 安装&#xff08;推荐&#xff09; tb-gateway 通用配置文件连接配置模块 thingsboard存储配置模块 storage远程调用配置模块 grpc连接器配置模块 connectors…

网络安全防御保护 Day3

正式开始前分享一个关闭日志弹窗的命令(在用户视图中输入)&#xff1a;undo terminal trapping 快被弹窗高出高血压了 AR1上构建环回 LSW2上配置vlan LSW7上的vlan配置&#xff08;我已经配置好了&#xff0c;但是有日志弹窗影响&#xff0c;为了截图就再敲一次所以有报错&…

【Linux系统】文件系统和软硬链接

前言 之前的博客介绍过了打开的文件是如何被操作系统管理起来的&#xff0c;但是绝大多数文件是没有被打开的&#xff0c;静静地躺在磁盘上。 这些文件也应该要被操作系统管理起来&#xff0c;以方便系统快速地在磁盘上查找它们&#xff0c;进而加载到内存。 这套管理方式就…

LeetCode刷题日志-117填充每个节点的下一个右侧指针II

二叉树的题目&#xff0c;我认为二叉树必须要掌握递归的三种遍历算法&#xff0c;以及层序遍历算法才能做二叉树题目。这道题目我的想法是&#xff1a; 因为在二叉树每一层中&#xff0c;next指针指向的是的当前节点的右边的节点&#xff0c;所以&#xff0c;使用层序遍历&…

会计试算平衡

目录 一. 试算平衡的意义二. 试算平衡的原理和内容三. 试算平衡表 \quad 一. 试算平衡的意义 \quad ①验证错误 ②便于编制会计报表 试算表根据各分类账借贷余额汇总编制而成&#xff0c;依据试算表编制会计报表将比直接依据分类账来编制更为方便,拥有大量分类账的企业尤为便捷…

计算机二级Python选择题考点——Python语言程序设计Ⅱ

代码1&#xff1a; def fibRate(n):if n < 0:return -1elif n 1:return -1elif n 2:return 1else:L [1,5]for i in range(2,n):L.append(L[-1] L[-2])return L[-2] % L[-1] print(fibRate(7))n 7 L [1,5] i 2 , 3 , 4 , 5 , 6 i 2 -> L[-1] L[-2] 5 1 6 -&g…

海外代理IP推荐:5大最佳Luminati替代方案

在跨境出海业务中&#xff0c;海外代理IP是非常高效的助力工具&#xff0c;因此也衍生了非常多的代理服务商。想必大多数都知道Brightdata&#xff08;原名Luminati&#xff09;&#xff0c;但是&#xff0c;由于代理IP的高需求&#xff0c;慢慢地我们发现除了高价的卢米&#…