结构体内部的无c链表



我有一个类型为ordiordinateur

typedef struct ordi
{
int numeroOrdi;
char *nomOrdi;
int CapaciteDisque;
lst_logi LogicielsInstalles;
} ordi;

这个ordinateur有一个类型为lst_logi的双链表LogicielsInstalles

typedef struct lst_logi
{
log *logiciel;
struct lst_logi *next;
struct lst_logi *prev;
} lst_logi;

我做了一个函数FormaterOrdinateur来删除所有的"Logiciels"(法语软件)
换句话说,释放链表LogicielsInstalles

void FormaterOridinateur(ordi *ordinateur)
{
lst_logi *head = &ordinateur->LogicielsInstalles;
lst_logi *tmp;
// printf("curr: %sn", head->logiciel->designation);
// printf("curr->next: %sn", (head->next)->logiciel->designation);
// these two line to make sure the node and node->next exit 
while (head)
{
tmp = head;
head = head->next;
free(tmp);
}
ordinateur = NULL;
}

,但这个函数给了我seg故障
更多的细节与gdb:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7e244c9 in arena_for_chunk (ptr=0x7fffffffe051) at ./malloc/arena.c:156
156     ./malloc/arena.c: No such file or directory.

当我搜索arena_for_chunk错误时,我发现这意味着内存不存在或不能被释放
我确信我试图释放的节点存在,所以它只是拒绝被释放。
对此有什么解释吗?我该怎么补救呢?
提前感谢;)

struct ordi中,LogicielsInstalles应该是一个指针,而不是一个结构,以说明没有安装软件的计算机,并避免在&ordinateur->LogicielsInstalles上出现无效的free

此外,函数FormaterOrdinateur在释放列表后不会重置指针LogicielsInstalles。它会设置ordinateur = NULL,因为ordinateur只是一个局部参数值,没有任何作用。

这可能会导致以后的无效访问或双free。

修改后的版本:

typedef struct lst_logi {
log *logiciel;
struct lst_logi *next;
struct lst_logi *prev;
} lst_logi;
typedef struct ordi {
int numeroOrdi;
char *nomOrdi;
int CapaciteDisque;
lst_logi *LogicielsInstalles;
} ordi;
void FormaterOrdinateur(ordi *ordinateur) {
lst_logi *node = ordinateur->LogicielsInstalles;
while (node) {
lst_logi *next = node->next;
// free the log structure pointed to by node->logiciel
free(node->logiciel);
// free the node structure
free(node);
node = next;
}
ordinateur->LogicielsInstalles = NULL;
}

相关内容

  • 没有找到相关文章

最新更新