У меня есть эти структуры:
typedef struct Nodo{
int id_nodo;
struct Nodo *next;
} Nodo;
typedef struct{
Nodo *head;
} inmap;
//Struct Grafo
typedef struct {
int N; // numero dei nodi del grafo
int *out; // array con il numero di archi uscenti da ogni nodo
inmap *in; // array con gli insiemi di archi entranti in ogni nodo
} grafo;
У меня есть график, содержащий указатель на массив элементов inmap (которые являются главами связанных списков).
Функция освобождения, которую я сделал, такова:
// Funzione per deallocare tutti i nodi della lista
void dealloca_lista(inmap *lista) {
// Ppuntatore ausiliario per scorrere la lista
Nodo *corrente = lista->head;
// Ciclo per scorrere ogni nodo della lista
while (corrente != NULL) {
// Salvo il puntatore al prossimo nodo
Nodo *prossimo = corrente->next;
// Dealloco la memoria occupata dal nodo corrente
free(corrente);
// Aggiorno il puntatore al nodo corrente con il prossimo
corrente = prossimo;
}
// Imposto l'head della lista a NULL
lista->head = NULL;
}
Это работает, но таким образом я освобождаю все узлы каждого списка, структура inmap по-прежнему выделяется (для каждой позиции массива g.in).
Следующая функция используется для создания каждого узла:
inmap crea_lista() {
inmap *nuova_lista = (inmap*)malloc(sizeof(inmap));
if (nuova_lista != NULL) {
nuova_lista->head = NULL;
}
return *nuova_lista;
}
Я попытался освободить всю структуру inmap в массиве, используя free(&g.in[i]) в цикле for, но получил ошибку сегментации.
Посмотрите на свой код, который создает массив. Вам нужно вызвать free() только для переменных, которые были созданы с помощью malloc().
если вы вызываете эту функцию освобождения прямо перед выходом процесса, подумайте здесь и здесь, если она вам вообще нужна
Указывает ли g.in на динамически выделяемую память?
g.in[i] — это структура inmap, созданная malloc() @IanAbbott.
g.in[i] необходимо освободить, поскольку каждый элемент выделяется благодаря функции malloc(). Действительно, используя valgrind, я могу убедиться, что я не освобождаю эти элементы в карте @Barmar.
Если g.in — это массив указателей, то это должно быть inmap **in.
Если я попробую с free(g.in[i]), я получу: передачу «inmap» в параметр несовместимого типа «void *»
Потому что это НЕ массив указателей. Ваша функция создания не возвращает динамически выделяемую структуру. Вы выполняете динамическое распределение, но не возвращаете этот указатель. У вас есть утечка памяти, потому что вы возвращаете содержимое по значению и никогда не освобождаете указатель.
ОООО, Я ВИЖУ. Проблема в том, что проект, который я делаю, заставляет меня использовать массив inmap, а не массив указателей на inmap. Итак, как я мог решить? СПАСИБО, ТЫ МОЙ СПАСИТЕЛЬ
Я спрашивал, на что указывает g.in, а не на что указывает g.in[i]. g.in[i] — это не указатель на inmap, это inmap. g.in — это указатель типа inmap *, а не массив inmap, но он может указывать на динамически выделяемую память или на первый (обычно) элемент массива inmap.
Извините, я не понял. g.in указывает на первый элемент динамически выделяемого массива inmap.



g.in — это массив структур, а не массив указателей, поэтому освобождать элементы не нужно.
Поскольку crea_lista() возвращает список по значению, его не нужно использовать malloc(), и тогда вам не нужно ничего освобождать.
inmap crea_lista() {
inmap nuova_lista = {NULL};
return nuova_lista;
}
g.in— это массив структурinmap, а не массив указателей. Они не выделяются динамически, поэтому их не нужно освобождать. Вам просто нужно сделатьfree(g.in)