【问题标题】:Reference to non-NULL value NULL after assignment赋值后引用非NULL值NULL
【发布时间】:2021-10-17 01:10:03
【问题描述】:

我正在使用 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
$4 = (struct Node *) 0x5555555551db <createList+18>

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

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

谁能澄清这种行为?谢谢。

【问题讨论】:

  • 如果您在该行停止,则该行尚未执行。 step 运行该行,然后再次检查值。
  • (a) 编辑问题以提供minimal reproducible example。 (b) createList 为一个节点分配空间并将head 设置为指向它,但不填充该空间,也没有显示任何其他代码。 insertNodeAtBeginning 可能正在使用未初始化的空间内容。 (c) 当代码在newNode-&gt;pNext = auxNode行中断时,该行还没有被执行。
  • head-&gt;pNext 未在 createList 中初始化

标签: c pointers linked-list singly-linked-list function-definition


【解决方案1】:

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

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

您已经创建了一个空列表

struct Node* head;

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

函数insertNodeAtBeginning也没有意义,因为至少它不会因为这段代码sn-p而在开头插入节点

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

此外,它会调用未定义的行为,因为指针head 指向的节点的数据成员pNext 未初始化。当head-&gt;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;
}

【讨论】:

    【解决方案2】:

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

    应该是……

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多