赋值后引用非 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;
函数内的数据成员nodeValue
和pNext
没有初始化,
函数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;
}
我正在使用 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;
函数内的数据成员nodeValue
和pNext
没有初始化,
函数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;
}