单链表--为结点指针分配内存时使用calloc而不是malloc

  • 运行环境 : visual studio 2019 community
  • malloc与calloc的主要区别

    • malloc() 函数在分配内存时,初始化变量的值是随机的
    • calloc() 函数在分配内存时,会将变量的值初始化为0
  • 为什么不用malloc()函数分配内存

    • malloc()的随机性导致在初始化链表结点的时候,结点中的指针会初始化为野指针,使得使用该链表时编译器报错
  • malloc()编译器报错样例

    #include<stdio.h>
    #include<stdlib.h>
    
    typedef int ElemType;
    //定义结点
    typedef struct LNode{
    	ElemType data;
    	struct LNode *next; 
    } *LinkList;
    
    // 插入节点
    int Insert_L(LinkList &L, int i, ElemType e) {
    // 向第i个位置插入结点
    	LinkList p = L;
    	int j = 0;
    	while (p && j < (i - 1)) {   // 寻找第i-1个结点
    		p = p->next;
    		j++;
    	}
    	if (!p || j > (i - 1))
    		return 0;
    	LinkList s = (LinkList)malloc(sizeof(LNode));	// 初始化要插入的结点
    	s->data = e;
    	s->next = p->next;
    	p->next = s;
    	return 1;
    }
    
    //打印链表
    void ListPrint_L(LinkList L) {
    	int i = 0;
    	while (L->next != NULL) {
    		L = L->next;
    		printf("%d ", L->data);
    	}
    }
    
    int main() {
    	LinkList L = (LinkList)malloc(sizeof(LNode));
    	for(int i = 0; i < 5; i++) {
    		Insert_L(L, i+1, i);
    	}
    	ListPrint_L(L);
    	return 0;
    }
    
    • 编译器运行结果
      在这里插入图片描述
      在这里插入图片描述
    • 由编译器运行结果可以看出,本应该指向NULL的next指针却指向了一个随机地址0xcdcdcdcd,并且编译器报错
  • 使用calloc()函数,解决上述问题

     #include<stdio.h>
    #include<stdlib.h>
    
    typedef int ElemType;
    //定义结点
    typedef struct LNode{
    	ElemType data;
    	struct LNode *next; 
    } *LinkList;
    
    // 插入节点
    int Insert_L(LinkList &L, int i, ElemType e) {
    // 向第i个位置插入结点
    	LinkList p = L;
    	int j = 0;
    	while (p && j < (i - 1)) {   // 寻找第i-1个结点
    		p = p->next;
    		j++;
    	}
    	if (!p || j > (i - 1))
    		return 0;
    	LinkList s = (LinkList)calloc(1, sizeof(LNode));	// 初始化要插入的结点
    	s->data = e;
    	s->next = p->next;
    	p->next = s;
    	return 1;
    }
    
    //打印链表
    void ListPrint_L(LinkList L) {
    	int i = 0;
    	while (L->next != NULL) {
    		L = L->next;
    		printf("%d ", L->data);
    	}
    }
    
    int main() {
    	LinkList L = (LinkList)calloc(1, sizeof(LNode));
    	for(int i = 0; i < 5; i++) {
    		Insert_L(L, i+1, i);
    	}
    	ListPrint_L(L);
    	return 0;
    }
    
  • 这篇博客是我在学习途中遇到的问题以及自己的解决方法,如有错误,欢迎指教
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值