在我的代码中找不到段错误

标签 c segmentation-fault

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

此代码出现段错误。但我找不到为什么会发生。你能帮我解决这个问题吗?

最佳答案

您的代码存在多个问题:

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

  • 您没有释放动态分配的内存。虽然就您而言,这没什么大不了的,但它告诉我您不熟悉动态分配的工作方式(此列表中的第一个要点也增强了我的信念)。每当你malloc某些东西时,总是释放它(在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;
}

关于在我的代码中找不到段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50615584/

相关文章:

c++ - 调用方法c++时出现段错误

c - 转义“在 system() 内部调用以用于 echo 命令

c - SDL 访问冲突

c - 我的程序中是否存在悬空指针?

c - 运行时出现分段核心转储错误

c - Cache Sim C 程序中的 SegFault

#else 预处理器指令后的注释

c - 指针、字符和 malloc

c - 加载文件时出现段错误(核心转储)

c - 尝试修改指向数组的指针时出现段错误