我一直试图在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;行)。

最佳答案

在使用temp->after之前,没有将其设置为有用的任何东西。因此temp->after->before取消引用垃圾。

初始化*temp,然后再使用它。

关于c - 试图在C中将结构的指针设置为NULL,但遇到valgrind问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15868311/

10-14 16:08
查看更多