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

2024-01-31 23:52

本文主要是介绍嵌入式学习第十五天!(内存管理、链表),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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.chinasem.cn/article/665452

相关文章

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

在Node.js中使用.env文件管理环境变量的全过程

《在Node.js中使用.env文件管理环境变量的全过程》Node.js应用程序通常依赖于环境变量来管理敏感信息或配置设置,.env文件已经成为一种流行的本地管理这些变量的方法,本文将探讨.env文件... 目录引言为什么使php用 .env 文件 ?如何在 Node.js 中使用 .env 文件最佳实践引

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象