Я знаю, что для каждого malloc должен быть free (), но в случае существующего связного списка, переданного в рекурсивную функцию для вставки нового узла в связанный список, как бы вы освободили это?Я использую valgrind, и он показывает мне, что я должен освободить malloc
Так что моя функция имеет в качестве параметров char * и указатель на список, переданный как **, я провел некоторые исследования, и это было необходимо длябыть переданным так, чтобы вставить новые узлы, даже если указатель работал только хорошо
void showDir(char *name, linkedList **list) {
DIR *dir;
struct dirent *entry;
if (!(dir = opendir(name))) return;
while ((entry = readdir(dir)) != NULL) {
if (entry->d_type == DT_DIR) {
char path[1024];
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
continue;
snprintf(path, sizeof(path), "%s/%s", name, entry->d_name);
showDir(path, list);
}
linkedList *node = malloc(sizeof(linkedList));
if (!node) {
printf("Error!");
}
node->next = NULL;
char filePath[1024];
snprintf(filePath, sizeof(filePath), "%s/%s", name, entry->d_name);
node->path = malloc(strlen(filePath) + 1);
strcpy(node->path, filePath);
if (*list) {
int found = 0;
for (linkedList *ptr = *list; ptr != NULL; ptr = ptr->next) {
if (strcmp(ptr->path, filePath) == 0) {
found = 1;
}
if (ptr->next == NULL && found == 0) {
ptr->next = node;
break;
}
}
} else {
*list = node;
}
}
closedir(dir);
}
Я вызываю рекурсивную функцию вот так showDir(ptr->path, &list);
и освобождаю ее вот так
linkedList *ptr = list;
while (ptr != NULL) {
linkedList *next = ptr->next;
free(ptr->path);
free(ptr);
ptr = next;
}
Конечно, список, переданный при первоначальном вызове, уже заполнен!
Спасибо за прочтение и надеюсь, что вы можете помочь понять, что я делаю здесь неправильно!
--EDIT
==1914== 64 (24 direct, 40 indirect) bytes in 1 blocks are definitely lost in loss record 2 of 14
==1914== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1914== by 0x10A633: showDir(filestat.c:512)
==1914== by 0x10A629: showDir(filestat.c:510)
==1914== by 0x10A629: showDir(filestat.c:510)
==1914== by 0x109581: main (filestat.c:186)