c语言 - 在我的代码中找不到分段错误


#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;
}

此代码给出分段错误。但我找不到为什么会发生这种情况。你能帮我这个吗?

您的代码存在多个问题:

  • 您正在mallocnode1但您没有在任何地方设置值。每当您尝试访问value时,这都会创建未定义的行为 - 您可能会使程序崩溃或可能会获得垃圾数据,这通常更糟,因为它会导致代码的其他部分表现得很奇怪。

  • 您不会释放动态分配的内存。虽然在你的情况下,这没什么大不了的,但它告诉我你不熟悉动态分配的工作方式(这个列表中的第一个要点也加强了我的信念(。每当您malloc某事时,请始终free它(C++您有newdelete(,并且(以防止意外行为(将指针设置为NULL

  • node2不是指针。Node *node1, node2;中的*仅适用于第一个变量。每个连续变量也需要一个*否则它将被分配到堆栈上。

  • 通过查看您的代码,很明显您希望node2成为指针(否则您不会将NULL作为其值:)分配(。在这种情况下,您正在尝试访问node2next,但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 的情况。

相关内容

  • 没有找到相关文章

最新更新