gpt4 book ai didi

c - 链表内存问题

转载 作者:太空宇宙 更新时间:2023-11-04 04:13:07 25 4
gpt4 key购买 nike

我实际上正在研究一个关于链表操作的项目,并且一切正常,但是当我使用 valgrind 运行它时,我发现存在很多内存问题。我把代码的一部分放在这里,我认为内存分配的问题是这样的,也许你可以帮我找出来。

所以,我必须从这种格式的文件中读取:

19971230 20220512 ALklklklk
19970905 20001203 BDHE UNE
20151212 20301123 CLEUSHI
20171221 20301025 DE klkllLU TOPI
20160315 20190227 Ehaaaa

并将它们放在一个链表中,由这个结构表示:

typedef struct cell{
int dateDeb;
int dateFin;
char text[TAILLE_MAX];
struct cell * suivant;
}message;

一开始我已经编写了这个函数来初始化列表的一个 block :

message * creationCellule(){

message * cellule;
cellule = (message *)malloc(sizeof(message));

if(cellule != NULL)
{
cellule -> dateDeb = 0;
cellule -> dateFin = 0;
cellule -> suivant = NULL;
memset(cellule->text, '\0', TAILLE_MAX);
}
return cellule;

}

从文件中读取的函数是这个:

void lectureFichier(const char * nomFichier, message ** tete)
{


FILE * fp = fopen(nomFichier, "r");
message * test;
test = creationCellule();

if(fp != NULL)
{

while(fscanf(fp,"%d %d ", &(test->dateDeb), &(test->dateFin)) == 2)
{
fgets(test -> text, 100, fp);

insertion(tete, test);
test = creationCellule(test);

}
}
fclose(fp);
}

插入函数就是这个:

void insertion(message ** tete, message * cellule){

message ** prec;


if(cellule != NULL){
prec = recherche(tete, cellule -> dateDeb);
cellule -> suivant = *prec;
*prec = cellule;
}

}

Valgrind 告诉我存在内存泄漏并且动态分配的内存没有被释放。这是正确的,因为我没有在这些函数中释放任何东西,但我不知道在哪里使用 free 因为我必须在循环中重用它。这是 valgrind 的结果:

enter image description here

你能告诉我一个解决方案如何解决这个问题,因为我被困在这个问题上。即使我需要函数creationCellule,也没关系。没有义务写那个。非常感谢您!

最佳答案

链接列表创建没有问题。但是,一旦您完成读取文件和链接列表,您需要释放。请记住,如果您使用了 malloc(),则必须调用 free() 来释放内存。像这样的东西——freeCellule(),你可以在从lectureFichier()返回之前调用这个函数:

   void freeCellule(message *ptr)
{
message * next;
while (ptr) {
next = ptr->suivant;
free(ptr);
ptr = next;

}
}

关于c - 链表内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55083128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com