Связанный список внутри освобождения массива в C

У меня есть эти структуры:

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, но получил ошибку сегментации.

g.in — это массив структур inmap, а не массив указателей. Они не выделяются динамически, поэтому их не нужно освобождать. Вам просто нужно сделать free(g.in)
Barmar 15.05.2024 17:14

Посмотрите на свой код, который создает массив. Вам нужно вызвать free() только для переменных, которые были созданы с помощью malloc().

Barmar 15.05.2024 17:15

если вы вызываете эту функцию освобождения прямо перед выходом процесса, подумайте здесь и здесь, если она вам вообще нужна

yano 15.05.2024 17:21

Указывает ли g.in на динамически выделяемую память?

Ian Abbott 15.05.2024 17:33

g.in[i] — это структура inmap, созданная malloc() @IanAbbott.

Samuele Bertucci 15.05.2024 18:38

g.in[i] необходимо освободить, поскольку каждый элемент выделяется благодаря функции malloc(). Действительно, используя valgrind, я могу убедиться, что я не освобождаю эти элементы в карте @Barmar.

Samuele Bertucci 15.05.2024 18:42

Если g.in — это массив указателей, то это должно быть inmap **in.

Barmar 15.05.2024 18:46

Если я попробую с free(g.in[i]), я получу: передачу «inmap» в параметр несовместимого типа «void *»

Samuele Bertucci 15.05.2024 18:47

Потому что это НЕ массив указателей. Ваша функция создания не возвращает динамически выделяемую структуру. Вы выполняете динамическое распределение, но не возвращаете этот указатель. У вас есть утечка памяти, потому что вы возвращаете содержимое по значению и никогда не освобождаете указатель.

Barmar 15.05.2024 18:48

ОООО, Я ВИЖУ. Проблема в том, что проект, который я делаю, заставляет меня использовать массив inmap, а не массив указателей на inmap. Итак, как я мог решить? СПАСИБО, ТЫ МОЙ СПАСИТЕЛЬ

Samuele Bertucci 15.05.2024 18:50

Я спрашивал, на что указывает g.in, а не на что указывает g.in[i]. g.in[i] — это не указатель на inmap, это inmap. g.in — это указатель типа inmap *, а не массив inmap, но он может указывать на динамически выделяемую память или на первый (обычно) элемент массива inmap.

Ian Abbott 15.05.2024 19:32

Извините, я не понял. g.in указывает на первый элемент динамически выделяемого массива inmap.

Samuele Bertucci 15.05.2024 19:35
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
12
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

g.in — это массив структур, а не массив указателей, поэтому освобождать элементы не нужно.

Поскольку crea_lista() возвращает список по значению, его не нужно использовать malloc(), и тогда вам не нужно ничего освобождать.

inmap crea_lista() {
    inmap nuova_lista = {NULL};
    return nuova_lista;
}

Другие вопросы по теме