c - 双重释放或损坏 - 删除列表的第一个节点时出错

标签 c list struct nodes

我有以下代码可以从列表中删除元素。当结构的其中一个元素低于我使用它的值时,我必须删除该节点。

代码如下:

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->percorridoscurr 相同,或者 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/

相关文章:

c - 将 PCI 设备切换到 D3 冷 (D3cold) 状态

java - 如何从数组或列表中删除两个元素的序列?

c# - 识别 IEnumerable 是否已排序的方法

python - 我可以在 python 中集成多个列表吗?

c - 成员分配是否保留了结构填充字节?

c - 指向结构成员的指针

pointers - 为 Phobos 的二进制堆比较指向结构的指针

c - C中的字符数组是否有最大返回长度

c - 在windows下查找程序在c中使用的总内存

c - UDP 原始套接字设置消息