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.

C, realloc, stuct - Realokowanie pamięci do char* w strukturze nie działa

kitor 10 Sty 2013 10:43 1656 6
  • #1 10 Sty 2013 10:43
    kitor
    Poziom 34  

    Witam!

    Mam następującą strukturę:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Struktura jest alokowana dynamicznie poprzez malloc w funkcji

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Problem polega na tym, że później za pomocą funkcji mam zmieniać pole Description. Realloc() użyty na końcu tej funkcji (wstawiony już tutaj, co by nie przedłużać posta) działa pod warunkiem, że przydzielam nim tyle samo/mniej pamięci do pola description. Powyższy przykład, 25 charów, kończy się zwróceniem wartości NULL i nie przydzieleniem pamięci.

    Ktoś z kolegów może mnie nakierować dlaczego tak się dzieje / gdzie robię błąd?

    0 6
  • Pomocny post
    #2 10 Sty 2013 11:45
    DRK82
    Poziom 11  

    Przede wszystkim tutaj powodujesz wyciek pamięci:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    bo alokujesz o 1 bajt za mało (zapominasz o bajcie o wartości 0 na końcu łańcucha znaków).

    0
  • Pomocny post
    #3 10 Sty 2013 11:48
    stanleysts
    Poziom 27  

    1. Dlaczego masz wogóle: int *newDesc a nie char* newDesc?

    2. Na stringi alokuje się jeszcze miejsce na znak "\0".

    0
  • #4 10 Sty 2013 11:49
    kitor
    Poziom 34  

    O długości stringów - dziękuję za uwagęl; przyznaję bez bicia że zapomniałem. I w tym momencie zaczęło wszystko działać.

    @stanleysts - pierwotnie było char*, zostało podmienione gdzieś podczas testowania.

    0
  • #5 11 Sty 2013 20:06
    kitor
    Poziom 34  

    Skoro ktoś wywołał moderatora do tablicy aby otworzyć wątek, proszę o info gdzie ten błąd w programie siedzi?

    0
  • Pomocny post
    #6 11 Sty 2013 20:25
    phanick
    Poziom 28  

    Błąd siedzi w tym miejscu:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Chyba nie zdajesz sobie sprawy, jak działa funkcja realloc: ona realokuje podany obszar pamięci w inne miejsce (zmniejsza/zwiększa go do podanego rozmiaru) oraz zwraca wskaźnik na NOWY obszar pamięci, uprzednio kopiując ze starego dane, po czym zwolniony zostaje stary obszar.

    Ty ignorujesz wskaźnik zwracany przez tą funkcję (zamiast przypisać go na wartość Book->description). To, że to działa, to jedynie przypadek. Odwołujesz się do starego obszaru pamięci, który już jest zwolniony. To, że tam nadal są stare dane wynika z faktu, że system jest leniwy i nie zamazuje tego obszaru. Ale w dowolnym momencie może tam się znaleźć coś innego i program się posypie.

    0
  • #7 11 Sty 2013 20:28
    kitor
    Poziom 34  

    O widzisz, dobra uwaga. Fakt, że w tej funkcji realloc znalazło się testowo, ale w innej zrobiłem dokładnie takiego samego babola. Dzięki za info :)

    0