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 错误与 (*d)->front->before=NULL; in remD() 中的行有关)。

4

2 回答 2

1

temp->after在你使用它之前没有设置任何有用的东西。所以temp->after->before取消引用垃圾。

使用前先初始化*temp

于 2013-04-07T22:04:26.743 回答
0

你期望temp->after不是NULL,因为后面的行(valgrind 抱怨的行),你->front为它分配了一些东西。您确定它永远不会为 NULL,但始终是有效值吗?

于 2013-04-07T22:04:16.883 回答