4

2 つの連続するノードを減算し、その結果をそれらの前の新しいノードに入れようとしています。しかし、セグメンテーション違反が発生し、プログラムが応答を停止します。

ここLinkListに構造があります。

void subtract_node(LinkList **p)
{
    LinkList *q,*temp=NULL,*r;
    int i=0;
    q=r=*p;
    temp=(LinkList*)malloc(sizeof(LinkList));
    while(q!=NULL)
    {
        temp->item=q->next->item-q->item;
        temp->next=q;
        if(i==0)
        {
            *p=r=temp;
            r=r->next->next;
            q=q->next->next;
        }
        else
        {
            r->next=temp;
            temp=r;
            r=r->next->next;
            q=q->next->next;
        }
        printf("%d",i++);
    }
}
4

1 に答える 1

1

next最初にその内容を null チェックしないと、リンクされたリスト内のポインターを逆参照することはできません。具体的にはこんな表現

q->next->item - q->item

q->nextの場合は失敗しますNULL。ループのヘッダーで確認qしましたが、クラッシュを回避するためNULLにも確認する必要があります。q->next

while((q!=NULL) && (q->next != NULL)) {
    ...
}
于 2013-02-17T18:06:55.380 に答える