学习嵌入式第十五天(堆区)

本文详细介绍了C语言中的内存管理函数malloc和free的用法,以及内存溢出、内存泄露和内存碎片的概念。同时给出了链表操作的创建、插入、显示、替换和删除函数实现,展示了如何在实际编程中应用这些概念。
摘要由CSDN通过智能技术生成

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会内存泄露

  
2.内存溢出:
    内存溢出也称为内存越界

3.内存泄露:
    程序中malloc的空间没有被释放

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

#include<string.h>
#include<stdio.h>
#include<stdlib.h>
typedef int datetype;

typedef struct node
{
    datetype date;
    struct node *pnext;
}linknode;
linknode *creatlinklist(void)
{
    linknode *ptmpnode = NULL;

    ptmpnode = malloc(sizeof(linknode));
    if(NULL == ptmpnode)
    {
        return NULL;
    }
    ptmpnode->pnext = NULL;

    return ptmpnode;
}
int insertheadlinklist(linknode *phead, datetype tmpdate)
{
    linknode *ptmpnode = NULL;

    ptmpnode = malloc(sizeof(linknode));
    if(NULL == ptmpnode)
    {
        return -1;
    }
    ptmpnode->date = tmpdate;
    ptmpnode->pnext = phead->pnext;
    phead->pnext = ptmpnode;

    return 0;
}
int showlinklist(linknode *phead)
{
    linknode * ptmpnode = NULL;

    ptmpnode = phead->pnext;
    while(ptmpnode != NULL)
    {
        printf("% d",ptmpnode->date);
        ptmpnode = ptmpnode->pnext;
    }
    printf("\n");
    return 0;
}
int replacelinklist(linknode *phead,datetype olddate,datetype newdate)
{
       linknode *ptmpnode = NULL;

    ptmpnode = phead->pnext;
    while(ptmpnode != NULL)
    {
        if( ptmpnode->date == olddate)
        {
            ptmpnode->date = newdate;
        }
        ptmpnode = ptmpnode->pnext;
    }
    return 0;
}
int deletelinklist(linknode *phead,datetype tmpdate)
{
    linknode *pprenode = NULL;
    linknode *ptmpnode = NULL;

    ptmpnode = phead->pnext;
    pprenode = phead;

    while(ptmpnode != NULL)
    {
        if(ptmpnode->date == tmpdate)
        {
            pprenode->pnext = ptmpnode->pnext;
            free(ptmpnode);
            ptmpnode = pprenode->pnext;
        }
        else
        {
            pprenode = pprenode->pnext;
            ptmpnode = ptmpnode->pnext;
        }
    }
}
int destroylinklist(linknode **phead)
{
    linknode *ptmpnode = NULL;
    linknode *pfreenode = NULL;

    ptmpnode = pfreenode = *phead;
    while(ptmpnode != NULL)
    {
        ptmpnode = ptmpnode->pnext;
        free(pfreenode);
        pfreenode = ptmpnode;
    }
    *phead = NULL;

    return 0;
}
int main(void)
{
    linknode *linklist = NULL;

    linklist = creatlinklist();
    insertheadlinklist(linklist,1);
    insertheadlinklist(linklist,2);
    insertheadlinklist(linklist,3);
    insertheadlinklist(linklist,4);
    insertheadlinklist(linklist,5);
    showlinklist(linklist);
    replacelinklist(linklist,5,66);
    replacelinklist(linklist,1,88);
    showlinklist(linklist);
    deletelinklist(linklist,66);
    showlinklist(linklist);
    destroylinklist(&linklist);

    return 0;

}

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值