内存管理,链表

内存管理
1.操作野指针会导致程序崩溃
    注意:操作指针时,注意指针指向的空间是否存在?是否可用?
2.避免产生内存溢出:
    1.存储越界
        当使用strcat、strcpy、strcmp函数时可能会产生内存越界
        应该用strncat、strncpy、strncmp函数替代
    2.越界访问    
        数组避免越界访问 
        字符串缺少\0导致的越界访问

3.堆区空间的使用:
    malloc 
    void *malloc(size_t size);
    功能:
        申请size个字节的堆区空间
    参数:
        size:申请空间的大小
    返回值:
        如果成功,返回指向申请空间的指针
        如果失败,返回NULL
    
    free
    void free(void *ptr);
    功能:
        释放堆区空间 
    参数:
        ptr:堆区空间首地址
    返回值:
        缺省

例:

注:1.strcpy(dst,str,31);比strcpy安全,防止内存越界,最多拷贝31个元素,还剩一个存‘\0’

        2.要修改谁就传谁的地址
4.内存泄露:
    申请的堆区空间没有被释放

5.malloc使用场景:
    1.函数体内部的局部变量会随函数结束被回收,可以考虑存放到堆区空间中避免随函数结束回收
    2.C语言中可变长数组可以通过malloc实现
      

6.内存碎片:

链表
1.数组:
    1.数组是有限个元素的集合
    2.数组的空间必须连续 
    3.数组的插入和删除效率低
2.链表: 
    1.链表空间不需要连续
    2.链表元素个数没有上限 
    3.链表存储空间变大
    4.单向链表、双向链表、内核链表、循环链表
    5.插入和删除效率很高

链表结点的创建

typede struct node{
    int data;
    struct node *pnext;
}LinkNode;

单向带头结点链表的创建

 /***********************************
  6  *函数名:CreatLinkList
  7  *功  能:
  8  *       创建一个空的单向有头链表
  9  *参  数:缺省(void)
 10  *返回值:成功返回头结点
 11  *      失败返回NULL
 12  *注意事项:
 13  *
 14  * ********************************/
 15 
 16 LinkNode *CreatLinkList(void){
 17     LinkNode *pTmpNode = NULL;
 18     //1.申请空间
 19     pTmpNode = malloc(sizeof(LinkNode));
 20 
 21     if(NULL == pTmpNode){
 22         return NULL;
 23     }
 24     //2.对每个成员赋初值
 25     pTmpNode->pNext = NULL;
 26     return pTmpNode;
 27 
 28 }
 29 

头插法插入结点

1.申请空间
2.数据存入
3.地址域賦值为空白节点的pnext
4.让头结点pnext指向新申请的节点

 /***********************************
 31  *函数名:InsertHeadNode
 32  *功  能:
 33  *       单向链表头插法插入元素
 34  *参  数:
 35  *      phead:链表头结点地址
 36  *      tmpdata:插入数据
 37  *返回值:
 38  *      成功返回0
 39  *      失败返回-1
 40  *注意事项:
 41  *
 42  * ********************************/
 43 int InsertHeadNode(LinkNode *pHead, int tmpdata){
 44     LinkNode *pTmpNode = NULL;
 45     
 46     pTmpNode = malloc(sizeof(LinkNode));
 47 
 48     if(NULL == pTmpNode){
 49         return -1;
 50     }
 51 
 52     pTmpNode->data = tmpdata;
 53     pTmpNode->pNext = pHead->pNext;
 54     pHead->pNext = pTmpNode;
 55 
 56     return 0;
 57 }

 打印链表中的所有元素


 59 /***********************************
 60  *函数名:ShowLinkList
 61  *功  能:
 62  *       打印链表中的所有元素
 63  *参  数:
 64  *      phead:链表头结点地址
 65  *返回值:
 66  *      缺省
 67  *注意事项:
 68  *
 69  * ******************************/
 70 void ShowLinkList(LinkNode *pHead){
 71     LinkNode *p = NULL;
 72 
 73     p = pHead->pNext;
 74 
 75     while(p != NULL){
 76         printf("%d ",p->data);
 77         p = p->pNext;
 78     }
 79     printf("\n");
 80     return ;
 81 }

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值