2

我正在尝试从列表中删除一个结构节点,但我一直面临同样的问题。

typedef struct task{ 
  char* id;
  struct task *next;
} task_t;

task_t** init(){    
  task_t **taskArray = malloc(6 * sizeof(task_t *));
  return taskArray;
}

void task_insert(task_t ** arrayTask, char* id, int prio){
  task_t *newTask = (task_t *) malloc (sizeof(task_t));
  newTask->id = id;
  if(*(arrayTask + prio) !=NULL){
    newTask->next = *(arrayTask + prio);
    *(arrayTask + prio) = newTask;
    }
  *(arrayTask + prio) = newTask;

}

void task_remove(task_t** arrayTask, char* id){
  task_t* auxtask, * auxtask1;
  int i;
  for(i = 0; i<arraySize; i++){
    auxtask1 = auxtask = arrayTask[i];
    while(auxtask != NULL){
        if(!strcmp(auxtask->id, id)){
            auxtask1 = auxtask->next;
            free(auxtask);
            printf("Task %s removed with success\n", id);
            return;         
            }
        else {
            auxtask1 = auxtask;
            auxtask = auxtask->next;
             }

     }
   }
}   

当我尝试释放 auxtask 时出现问题。会发生什么以某种方式释放了 ID 字段,而不是结构节点本身。

有人知道这里发生了什么吗?

4

2 回答 2

1

你忘了一行:

auxtask1 = auxtask->next;
free(auxtask);
auxtask = auxtask1;        // <-- here

没有它,您将释放auxtask然后“忘记”它的下一个指针。下次循环时,您使用auxtaskwhich 指向已释放的内存。

只是一个小问题......反过来使用临时工更正常。

to_delete = auxtask;
auxtask = auxtask->next;
free(to_delete);
于 2013-09-30T22:48:39.143 回答
0

我假设因为您的任务数组只为指向 task_t 的指针分配空间,所以当您填充数组时,您在其他地方还有另一个分配步骤?

另外,为什么你有一个作为数组访问的列表?为什么还要列一个清单?

于 2013-10-01T00:16:00.433 回答