C语言中字母链表的分段错误

C语言中字母链表的分段错误,c,struct,linked-list,singly-linked-list,function-definition,C,Struct,Linked List,Singly Linked List,Function Definition,我的字母链表中出现了一个分段错误,我在最后一个else语句中将其锁定到了prev else { prev->next = new_node; new_node->next = ptr; return 0; } 如何解决此问题 int add(char *str, char *file) { struct word_node *new_node = malloc(sizeof(struct word_node)); unsigned len = strle

我的字母链表中出现了一个分段错误,我在最后一个else语句中将其锁定到了prev

else 
{
    prev->next = new_node;
    new_node->next = ptr;
    return 0;
}
如何解决此问题

int add(char *str, char *file) {
struct word_node *new_node = malloc(sizeof(struct word_node));

unsigned len = strlen(str) + 1;
char *s = malloc(len);
memcpy(s, str, len);

new_node->data = s;
new_node->count = 1;
new_node->filename = file;
new_node->next = NULL;

// struct word_node 

if (head == NULL)
{
    head = new_node;
    return 0;
}

struct word_node* ptr = head;
struct word_node* prev = NULL;

while (ptr != NULL)
{
    if (strcmp(ptr->data, new_node->data) > 0)
    {
        break;
    }
    ptr = ptr->next;
}

if (ptr == head)
{
    new_node->next = head;
    head = new_node;
    return 0;
}
else 
{
    prev->next = new_node;
    new_node->next = ptr;
    return 0;
}
}

您的代码简化为:

struct word_node*prev=NULL;
上一步->下一步=新建_节点;
现在看到问题了吗

要运行第二行,您必须在使用它之前将
prev
初始化为有效的内容。

在此while循环中

while (ptr != NULL)
{
    if (strcmp(ptr->data, new_node->data) > 0)
    {
        break;
    }
    ptr = ptr->next;
}
例如,您忘记更新指针
prev

while (ptr != NULL)
{
    if (strcmp(ptr->data, new_node->data) > 0)
    {
        break;
    }
    prev = ptr;
    ptr = ptr->next;
}

⟼请记住,保持代码尽可能有条理是非常重要的,尤其是在学习和询问有关堆栈溢出的问题时。有助于沟通结构,更重要的是,有助于我们快速找到问题的根源,而无需花费大量时间试图解码正在发生的事情。@tadman我不明白。我做了ptr==头。我使用ptr==head和ptr==NULL进行了测试,发现两者都存在分段错误。值得注意的是,
head
应该是此函数的参数,而不是全局变量。是的,我正在访问NULL节点。然而,我在我的另一个项目中使用了这一策略,并且成功了。我是否应该以某种方式初始化prev节点?您不能取消引用
NULL
指针,并期望代码正常工作,尤其是在该位置更改数据时。这是指针最基本的规则之一。我怀疑这在您的其他代码中是否有效。您可能弄错了,因为您所做的可能不同。这段代码在大多数系统上是一个自动的、即时的分段错误。同样从算法的角度来看,prev必须引用一个节点(前一个),在这种情况下,它不指向任何地方,因为它是空的。您可以使用prev->next==NULL,但不能使用prev,否则它与前面提到的@tadman完全相同。