我正在尝试从列表中删除结构节点,但我仍然面临同样的问题。
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字段,而不是结构节点本身。
有人对这里发生的事情有任何线索吗?
答案 0 :(得分:1)
你忘记了一句话:
auxtask1 = auxtask->next;
free(auxtask);
auxtask = auxtask1; // <-- here
没有它,你释放auxtask
然后'忘记'它的下一个指针。下一次循环时,你使用auxtask
指向已释放的内存。
只是一个小问题......反过来使用临时工更为正常。
to_delete = auxtask;
auxtask = auxtask->next;
free(to_delete);
答案 1 :(得分:0)
我认为因为你的任务数组只为指向task_t的指针分配空间,所以当你填充数组时,你在其他地方有另一个分配步骤?
另外,为什么你有一个列表,你作为一个数组访问?为什么甚至把它列为一个清单?