Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ANSI C - Zwalnianie pamięci struktury zawierającej tablicę wskaźników do struktu

jowyma 13 Sty 2015 00:07 849 2
  • #1 13 Sty 2015 00:07
    jowyma
    Poziom 22  

    Proszę o pomoc, bo nie rozumiem dlaczego kompilator zwraca błędy. W programie tworzę strukturę, która zawiera tablicę struktur. Innymi słowami:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    W programie głównym tworzę wskaźnik do struktury2 i przydzielam mu pamięć na całą strukturę 2:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Potem w funkcji pytam użytkownika ile będzie elementów w tablicy zawartej w strukturze 2 i w funkcji przydzielam pamięć.

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Na koniec programu chcę zwolnić pamięć. Nie ważne gdzie nie umieszczam funkcji free obydwie wywalają błędy:
    free(struktura2->tablica);
    free(struktura2);

    Naprawdę nie rozumiem dlaczego i co jest źle.

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0 2
  • Pomocny post
    #2 13 Sty 2015 05:34
    kspro
    Poziom 27  

    Jak ja lubię te długie nazwy, niby pomocne a tak naprawdę cholernie mylące... No ale nic. Zobacz co masz w funkcji main():

    K * kolejka;
    kolejka=malloc(sizeof(kolejka));

    a powinno być:

    kolejka=malloc(sizeof(K));

    No przecież sizeof(kolejka) to raptem 4 bajty (czy tam ile liczy sobie zwykły pointer, jakim jest kolejka) i gdy potem w funkcji InicjujKolejke() wywołujesz ponownie malloc(), to dostajesz adres zaraz z tymi 4-ma bajtami, w rezultacie czego oba obszary pamięci nakładają się na siebie. Później program modyfikując poszczególne pola struktury kolejka zamazuje pierwszy element z tablicy zleceń i vice versa, a potem free() nie rozpoznaje własnego bloku pamięci, bo ten ma zniszczony nagłówek.

    0
  • #3 13 Sty 2015 08:41
    jowyma
    Poziom 22  

    Dziękuję, wszystki teraz pięknie działa.

    0