单链表--为结点指针分配内存时使用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; }
这篇博客是我在学习途中遇到的问题以及自己的解决方法,如有错误,欢迎指教