从双向链表段错误中删除两项
Deleting two items from doubly-linked list segfault
我有一个程序使用双向链表并对其进行了简化。
NULL<-> [HEADPTR] <->[VALUEA, 1] <-> [ValueB, 2] <-> [ADD, VALUEA, VALUEB] <-> ...列表的其余部分
NULL <-> [VALUEC, 3] <-> ...列表的其余部分。
我只是对如何同时删除 VALUEA 和 B 感到困惑。我可以成功删除其中一个值,但是当我尝试删除它们时,我遇到了分段错误。我知道我删除第二个节点的逻辑是错误的。我正在使用三指针系统来查找和简化值。
while(rightP->next != NULL){
if(rightP->critical == 'Y'){
//printf("Found a critial\n");
//Critical helps me find what I need to merge
rightP->field2 = leftP->field2 + middleP->field2;
//printf("MERGING ADD %d\n", rightP->field2);
temp1 = leftP;
if(leftP->prev != NULL)
leftP = leftP->prev;
else
leftP->prev = NULL;
leftP->next = temp1->next;
leftP->next->prev = leftP;
free(temp1);
//bad segment
//Yields Seg fault
temp2 = middleP;
middleP->prev = leftP;
middleP->next = temp2->next;
middleP->next->prev = middleP;
middleP = rightP;
rightP = rightP->next;
free(temp2);
}
leftP = leftP->next;
middleP = middleP->next;
rightP = rightP->next;
else{
leftP = leftP->next;
middleP = middleP->next;
rightP = rightP->next;
}
}
几年前,我在我的 K&R ansi c 书中记下了一个笔记。
关于 free(temp1);
的使用,你不能这样做
你没有 post 完整的代码,但是你对 temp1 = leftP
然后 free(temp1)
的使用几乎正是我几年前记下的,说不能那样做。
从来没有想过原因,它是基于使用 malloc()
或 calloc()
然后当使用 free()
时 free()
的参数必须是malloc 或 calloc 语句中使用的指针。
建议您以不同的方式重新使用临时指针;然后无论指针名称 假设 你使用 malloc
然后使用该指针并将其设置为你想要释放的节点......在调整 ->next
和 ->previous
值以保持列表完整。
找到了:
第 252 页,K&R The C Programming Language 第二版
void free ( void *p )
free 释放 p 指向的 space;如果 p 为空,它什么都不做。 p 必须是指向之前由 calloc、malloc 或 realloc 分配的 space 的指针。
我有一个程序使用双向链表并对其进行了简化。
NULL<-> [HEADPTR] <->[VALUEA, 1] <-> [ValueB, 2] <-> [ADD, VALUEA, VALUEB] <-> ...列表的其余部分
NULL <-> [VALUEC, 3] <-> ...列表的其余部分。
我只是对如何同时删除 VALUEA 和 B 感到困惑。我可以成功删除其中一个值,但是当我尝试删除它们时,我遇到了分段错误。我知道我删除第二个节点的逻辑是错误的。我正在使用三指针系统来查找和简化值。
while(rightP->next != NULL){
if(rightP->critical == 'Y'){
//printf("Found a critial\n");
//Critical helps me find what I need to merge
rightP->field2 = leftP->field2 + middleP->field2;
//printf("MERGING ADD %d\n", rightP->field2);
temp1 = leftP;
if(leftP->prev != NULL)
leftP = leftP->prev;
else
leftP->prev = NULL;
leftP->next = temp1->next;
leftP->next->prev = leftP;
free(temp1);
//bad segment
//Yields Seg fault
temp2 = middleP;
middleP->prev = leftP;
middleP->next = temp2->next;
middleP->next->prev = middleP;
middleP = rightP;
rightP = rightP->next;
free(temp2);
}
leftP = leftP->next;
middleP = middleP->next;
rightP = rightP->next;
else{
leftP = leftP->next;
middleP = middleP->next;
rightP = rightP->next;
}
}
几年前,我在我的 K&R ansi c 书中记下了一个笔记。
关于 free(temp1);
你没有 post 完整的代码,但是你对 temp1 = leftP
然后 free(temp1)
的使用几乎正是我几年前记下的,说不能那样做。
从来没有想过原因,它是基于使用 malloc()
或 calloc()
然后当使用 free()
时 free()
的参数必须是malloc 或 calloc 语句中使用的指针。
建议您以不同的方式重新使用临时指针;然后无论指针名称 假设 你使用 malloc
然后使用该指针并将其设置为你想要释放的节点......在调整 ->next
和 ->previous
值以保持列表完整。
找到了:
第 252 页,K&R The C Programming Language 第二版
void free ( void *p )
free 释放 p 指向的 space;如果 p 为空,它什么都不做。 p 必须是指向之前由 calloc、malloc 或 realloc 分配的 space 的指针。