c - 如何正确初始化链表

标签 c struct

初始化链表时,我定义参数为*L,如:

Status InitList(LinkList *L)
{ 
   *L=(LinkList)malloc(sizeof(struct LNode));
   if(!*L) 
     exit(OVERFLOW);
   (*L)->next=NULL;
   return OK;
}

但不是

Status InitList(LinkList L)
{ 
   L=(LinkList)malloc(sizeof(struct LNode));
   if(!L) 
     exit(OVERFLOW);
   (L)->next=NULL;
   return OK;
}

为什么不是真的?

struct LNode
{
    ElemType data;
    struct LNode *next;
};
typedef struct LNode *LinkList;

最佳答案

在第二个实现中,您有一个初始化的局部变量 L。问题是,它是一个局部变量——改变它不会改变调用代码中的变量。当函数退出时,您丢失了分配的内存——内存泄漏。他们很糟糕!

第一个代码获取一个指向调用代码中的变量的指针并小心地更改它。这不会泄漏内存。

您可以使用如下代码修改第二个,使其工作:

LinkList NewList(void)
{ 
   LinkList L = (LinkList)malloc(sizeof(*L));
   if (L)
   {
       L->data = 0;
       L->next = NULL;
   }
   return L;
}

它做了不同的工作,所以它被重命名了。 请注意,它确保结构的所有元素都初始化为已知值。你会这样调用它:

LinkList list = NewList();

关于c - 如何正确初始化链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23198587/

相关文章:

c - 使用字符数组作为长整型数组

c - 为 C 准备好 Emacs 设置

c - 对自定义共享库的 undefined reference

c - 为使用 Threads 实现的 SPOJ 提交解决方案

在 Go 中对结构进行 Jsonify 映射

C:在 for 循环中创建结构体数组

c - 将函数作为参数传递,带或不带 & 符号 c

swift - 来自 [字符串 : Any] to "Key = Value" String in Swift

json:无法将字符串解码为 []main.KVU 类型的 Go 值

c - Haskell FFi 与 c2hs : Better out-marshalling of structs