我有以下代码可以从列表中删除元素。当结构的其中一个元素低于我使用它的值时,我必须删除该节点。
代码如下:
void DeleteNode(frota** head, int MAX, int nSquareW){
int i, eliminate = 0;
frota* curr = *head;
frota* curr1 = curr;
if(*head != NULL)
{
while(curr1 != NULL)
{
if(curr1->bateria < MAX)
{
if( *head == curr1){
if(curr1->next != NULL){
(curr1->next)->prev = NULL;
}
*head = curr1->next;
}else if(curr1 -> next == NULL){
(curr1->prev)->next = NULL;
}else{
(curr1->next)->prev = curr1->prev;
(curr1->prev)->next = curr1->next;
}
eliminate = 1;
}
curr1 = curr1->next;
if(eliminate == 1){
eliminate = 0;
printf("entrei1");
for(i=0;i<nSquareW;i++){
free(curr->percorridos[i]);
}
free(curr->percorridos);
free(curr);
}
curr = curr1;
}
}
}
当我尝试删除最后一个和中间节点时代码运行良好(值 head 等于第一个节点,除非没有,则值为 NULL),但是当我尝试删除第一个节点时,我得到以下错误:
*** “./iClean”中的错误:双重释放或损坏 (!prev):0x09bd4a20 ***
有人已经告诉我,问题出在删除节点( free() )时,我对此无能为力。
如有任何帮助,我们将不胜感激。
编辑
nSquareWidth 是 map 的宽度。
这是生成 percorridos 的代码:
void faz_mapa(matriz *** mapa, int nSquareW, int nSquareH){
*mapa = malloc(nSquareW * sizeof(matriz*));
for (int i = 0; i < nSquareW; i++)
{
(*mapa)[i]= malloc( nSquareH * sizeof(matriz));
}
for (int i = 0; i < nSquareW; i++)
{
for (int j = 0; j < nSquareH; j++)
{
//inicializa divisao suja
(*mapa)[i][j].limpo = 0;
(*mapa)[i][j].ocupado = NULL;
}
}
}
和结构:
typedef struct robot {
int bateria;
char nome[STRING_SIZE];
int pos_x;
int pos_y;
int target_x;
int target_y;
int limpos;
matriz ** percorridos;
struct robot * next;
struct robot * prev;
}frota;
最佳答案
我没有运行你的代码,但很明显只有一个地方我们可以遇到双重释放。
for(i=0;i<nSquareW;i++){
free(curr->percorridos[i]);
}
free(curr->percorridos);
free(curr);
要么你遇到的情况是 curr->percorridos
与 curr
相同,或者 curr->percorridos[i]
是与 curr->percorridos
相同吗?
您可以通过在每次调用 free 之前添加打印语句来找出这一点。然后找出哪个被调用了两次。
for(i=0;i<nSquareW;i++){
printf("Freeing curr->perrcorridos[i] at %p\n", curr->percorridos[i]);
free(curr->percorridos[i]);
}
printf("Freeing curr->perrcorridos at %p\n", curr->percorridos);
free(curr->percorridos);
printf("Freeing curr at %p\n", curr);
free(curr);
关于c - 双重释放或损坏 - 删除列表的第一个节点时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30403538/