检查指针数据时的分段错误

时间:2014-07-12 19:58:39

标签: c data-structures

我尝试在指定数据之后在双链表中插入数据,并显示段错误。

void dllinsertafter(struct node **head,int data,int data1)
{
struct node *temp,*newnode;
newnode=(struct node*)malloc(sizeof(struct node));
newnode->data=data;
temp=*head;
while ((temp->data)!=data1)
    temp=temp->next;
newnode->next=temp->next;
temp->next->prev=newnode;
newnode->prev=temp;
temp->next=newnode;
}

不知道为什么错误在while(temp-> data!= data1)。使用的结构对于双链表是常见的。

2 个答案:

答案 0 :(得分:2)

所以这里有一些通用的想法:

  1. 您为temp分配内存,然后立即泄漏。

  2. 在你的while循环中,如果你永远不会找到 data1会怎样?

    然后对于某个节点temp->next == NULL,那么您将NULL分配给temp,然后您将尝试取消引用temp,以确保出现错误。

  3. WhozCraig noted another location for a fault。如果*head == NULL会发生什么。也就是说,你从一个空列表开始?在这种情况下,您将立即分配temp = NULL,然后您很快就会尝试取消引用temp,以确保出现错误。

答案 1 :(得分:0)

如果找不到data1,则会发生崩溃。有些情况处理不当,改变下面的逻辑,这将解决崩溃。

//check to prevent the crash if list is empty
if (*head == NULL)
{

    *head = newnode;
    newnode->previous = newnode->next = NULL;
}
else
{
    temp=*head;
    while(temp != NULL)
    {
        if((temp->data)==data1)break;
        temp=temp->next;
    }
    newnode->next=temp->next;
    //check to prevent the crash if data1 is last element
    if (temp->next != NULL)
    {
        temp->next->prev=newnode;
    }
    newnode->prev=temp;
    temp->next=newnode;
}

temp=(struct node*)malloc(sizeof(struct node)); - 不需要此内存分配,这会在temp=*head;泄露