背景
在使用链表的时候,需要初始化链表指针的头结点。如何让这个这个头结点初始化有效。就是今天要讨论的问题。
解决方案
初始化链表头结点,实际上就是分配一个内存空间。注意:这里没有讨论使用指针后的释放。有关内存泄漏,野指针的问题不做讨论。
实现一
通过二级指针实现对地址的更改。
#include <stdio.h>
#include <malloc.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode;
void InitLinkList(LNode **L)
{
(*L)=(LNode *)malloc(sizeof(LNode));
(*L)->data=0;
(*L)->next=NULL;
}
int main()
{
LNode *L=NULL;
InitLinkList(&L); //注意这里的传参,入参需要二级指针,所以要用&
printf("%p\n",L);
printf("size_of_LNode = %d\n", sizeof(int));
return 0;
}
实现二
通过指针函数来实现对地址的改变。
指针函数:函数的返回值是指针。所以调用函数之后,需要赋值给一个指针变量。
#include <stdio.h>
#include <malloc.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode;
LNode * InitLinkList(LNode *L)
{
L=(LNode *)malloc(sizeof(LNode));
L->data=0;
L->next=NULL;
return L;
}
int main()
{
LNode *L=NULL;
L=InitLinkList(L); //需要有一个指针,来接收返回值
printf("%p\n",L);
return 0;
}
常见错误
用一级指针做初始化。结果导致,没有初始化成功。头结点成为了空指针。
此处错在,函数调用结束之后,指针的值并没有得到保存。所以要用二级指针来处理。
#include <stdio.h>
#include <malloc.h>
#include <assert.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode;
void InitLinkList(LNode *L)
{
L=(LNode *)malloc(sizeof(LNode));
L->data=0;
L->next=NULL;
}
int main()
{
LNode *L=NULL;
InitLinkList(L);
assert(L != NULL);
printf("%p\n",L);
return 0;
}