赋值后引用非 NULL 值 NULL

Reference to non-NULL value NULL after assignment

我正在使用 C 实现单向链表。

struct Node 
{
    int nodeValue;
    struct Node* pNext;
};

struct Node* head;

void createList()
{
    head = (struct Node*)malloc(sizeof(struct Node));
}

void insertNodeAtBeginning(int value)
{
    struct Node* newNode;
    newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->nodeValue = value;
    struct Node* auxNode;

    if(head->pNext == NULL)
    {
        head->pNext = newNode;        
    }

    else
    {
        auxNode = head->pNext;
        head->pNext = newNode;
        newNode->pNext = auxNode;    //breakpoint set here
    }
}

我在注释标记的行上设置了一个断点。 auxNode 的值为非 NULL:

(gdb) p auxNode
 = (struct Node *) 0x5555555551db <createList+18>

但是 auxNode 分配给的 newNode->pNext 的值为 NULL:

(gdb) p newNode->pNext
 = (struct Node *) 0x0

谁能澄清一下这种行为?谢谢

对于初学者来说,函数 createList 没有意义。

void createList()
{
    head = (struct Node*)malloc(sizeof(struct Node));
}

您已经创建了一个空列表

struct Node* head;

函数内的数据成员nodeValuepNext没有初始化,

函数insertNodeAtBeginning也没有任何意义,因为至少由于这段代码片段它不会在开头插入节点

if(head->pNext == NULL)
{
    head->pNext = newNode;        
}

此外,它调用未定义的行为,因为指针 head 指向的节点的数据成员 pNext 未初始化。当 head->pNext 等于 NULL.

时,您再次忘记初始化新节点的数据成员 pNext

去掉函数createList,按如下方式定义函数insertNodeAtBeginning

int insertNodeAtBeginning(int value)
{
    struct Node* newNode = malloc( sizeof( struct Node ) );
    int success = newNode != NULL;

    if ( success )
    {
        newNode->nodeValue = value;
        newNode->pNext = head;
        head = newNode;        
    }

    return success;
}

看起来你想维护你的头节点,但是在头节点和头节点之后的节点之间插入,对吗?如果是这种情况,那么除了误导性的函数名称(也许 insertNodeAfterHead 更合适)之外,您应该在使用 malloc 分配后初始化您的头结构成员。

应该是...

void createList()
{
    head = (struct Node*)malloc(sizeof(struct Node));
    head->nodeValue = 0
    head->pNext = NULL;
}