0

C のデータ構造の一部へのポインタを設定しようとしましたが、valgrind でエラーが発生しました。このエラーは、非ポインターを NULL ポインターにしようとしているエラーだと認識していますが、ここではそうではありません。どうしたの?

struct node {
    int data;
    struct node *before;
    struct node *after;
};

struct deque {
    struct node *front;
    struct node *rear;
};

int createD (Deque *d)
{
    printf ("Y\n");
    (*d) = malloc(100*sizeof(struct deque));
    (*d)->front=NULL;
    (*d)->rear=NULL;
    return 0;
}

int remD (Deque *d, char **s)
    {
    struct node *temp;
    temp=malloc(100*sizeof(struct node));
    int data;
    if (isEmptyD(d)==0)
    {
        printf ("Why?");
        return 1;
    }
    else
    {
        temp = (*d)->front;
        data = temp->data;
        (*d)->front=temp->after;
        (*d)->front->before=NULL;
        if((*d)->front==NULL)
        {
            (*d)->rear=NULL;
        }
        (*s)=malloc(100);
        (**s)=data;
        free(temp);
    }
    return 0;
}

==30983== Invalid write of size 8
==30983==    at 0x4010B5: remD (Deque.c:101)
==30983==    by 0x400C98: assign (Merge13.c:134)
==30983==    by 0x400BFB: mergesort (Merge13.c:113)
==30983==    by 0x400B03: queues (Merge13.c:64)
==30983==    by 0x400995: main (Merge13.c:26)
==30983==  Address 0x8 is not stack'd, malloc'd or (recently) free'd
==30983== 
==30983== 
==30983== Process terminating with default action of signal 11 (SIGSEGV)

(valgrind エラーは、remD() の行 (*d)->front->before=NULL; を参照しています)。

4

2 に答える 2

0

の後の行 (valgrind が文句を言う行) で、何かを割り当てているため、temp->afterではないことが予想されます。NULL になることはなく、常に有効な値であると確信していますか?NULL->front

于 2013-04-07T22:04:16.883 に答える