我一直试图在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/