#include <stdio.h>
#include <stdlib.h>
typedef struct node{
struct node* next;
int value;
}Node;
int findLastNodeValue(Node* head){
while(head -> next != NULL){
head = head -> next;
}
return head -> value;
}
int main(){
Node *node1,node2;
node1 = (Node *)malloc(sizeof(Node);
node2 = NULL;
node1 -> next = node2;
findLastNodeValue(node1);
findLastNodeValue(node2);
return 0;
}
此代码出现段错误。但我找不到为什么会发生。你能帮我解决这个问题吗?
最佳答案
您的代码存在多个问题:
您正在
malloc
ingnode1
,但没有在任何地方设置该值。每当您尝试访问值
时,这都会产生未定义的行为 - 您可能会崩溃程序,或者可能会得到垃圾数据,这通常更糟糕,因为它会导致代码的其他部分表现得很奇怪。您没有释放动态分配的内存。虽然就您而言,这没什么大不了的,但它告诉我您不熟悉动态分配的工作方式(此列表中的第一个要点也增强了我的信念)。每当你
malloc
某些东西时,总是释放
它(在C++中,你有new
和delete
)并且(以防止意外行为)将指针设置为NULL
。node2
不是指针。Node *node1, node2;
中的*
仅适用于第一个变量。每个连续变量还需要一个*
,否则它将在堆栈上分配。通过查看您的代码,很明显您希望
node2
成为一个指针(否则您不会将NULL
指定为其值:)) 。在这种情况下,您尝试访问node2
的next
,但node2
已初始化为NULL
:int findLastNodeValue(Node* head){ // You are passing node2, which is NULL while(head -> next != NULL){ // Can't access next of a NULL -> code breaks head = head -> next; } return head -> value; }
作为一般规则,请执行以下操作:
尝试使用实例化节点的函数 - 因为这是
C
你没有构造函数,我建议编写一个函数(或几个,具体取决于你需要多少功能) )生成一个新节点。这样你将确保至少不会有机会未初始化节点例如:
Node* createNode(int value) { Node* node = (Node *)malloc(sizeof(Node)); if (!node) return NULL; // If malloc fails for some reason node -> value = value; node -> next = NULL; return node; }
尝试使用删除节点的函数 - 如果有机会再次访问已删除的引用,请将其设置为
NULL
并处理NULL
值相应地例如:
void deleteNode(Node** node) { if (!*node) return; free(*node); *node = NULL; }
请注意,上面的代码不会删除
next
引用的内容,因为我们只想删除传递给函数的节点。如果您有previous
(在双链表的情况下),您必须首先访问next
节点,设置其previous
值为NULL
,然后删除当前节点。每当您传递一个指针时,始终在对它所引用的数据执行任何操作之前,始终检查该指针是否为
NULL
。将其与第一点的节点创建器函数结合起来,您可以确定您没有传递一些尚未正确初始化的Node
指针
现在,特别是对于您的功能,我将执行以下操作:
int findLastNodeValue(Node* head) {
if (!head) return -1; // We have a null reference, so there is nothing else to do here; exit accordingly and check the return value to see if the function call has been successful
while(head -> next != NULL) {
head = head -> next;
}
return head -> value;
}
关于在我的代码中找不到段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50615584/