链表-空指针检查?

Linked List- NULL pointer check?

在这个添加到链表的代码片段中,if (List==NULL) 是做什么的?我试图向它投入一些投入,看看我是否可以在没有运气的情况下参与该声明。哪种类型的输入有效?

main()
{
    struct Node *List;
    List = NULL;

    append (&List, 5);
}



void append(struct Node **List, int num)
{
    if (List == NULL)
    {
        return;
    }


    if (*List == NULL)
    {
        *List = malloc(sizeof(struct Node));
        (*List)->data = num;
        (*List)->next = NULL;

    }
   //some additional cases edited out for brevity
}

如果您将 NULL 作为 List 指针传递,当您在以下位置取消引用时,程序将崩溃:

if (*List == NULL)

所以你必须检查那个函数不是用 NULL 作为参数调用的

如果您(或您图书馆的用户)出于某种原因调用 append(NULL,42);,那么,由于 if(List == NULL) 检查,您的程序将不会崩溃。否则(如果您删除 if(List == NULL) 检查)它是 undefined behavior and practically segmentation fault would happen. That check is an instance of defensive programming.

原则上看起来 append 应该被称为 append(&somevar, someint) 但这没有记录,所以添加提取检查( 非常便宜 在运行时!)是值得的。