#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
node1
但您没有在任何地方设置值。每当您尝试访问value
时,这都会创建未定义的行为 - 您可能会使程序崩溃或可能会获得垃圾数据,这通常更糟,因为它会导致代码的其他部分表现得很奇怪。 -
您不会释放动态分配的内存。虽然在你的情况下,这没什么大不了的,但它告诉我你不熟悉动态分配的工作方式(这个列表中的第一个要点也加强了我的信念(。每当您
malloc
某事时,请始终free
它(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;
}
findLastNodeValue(node2( 是你最大的问题。当你将 NULL 发送到 findLastNodeValue 时,你尝试做的第一件事就是取消引用子句处的 NULL 指针(head -> next != NULL(。
要解决此问题,您可以在 while 循环之前检查并处理 findLastNodeValue 函数中的 head 为 NULL 的情况。