3 svar
88 visningar
Didar 212
Postad: 30 okt 2022 19:50

Hur frigör man minne i denna kod?

Hej, jag har fastnat och vet inte hur jag ska frigöra minne, jag antog att man skulle skriva ''free(list->itemlist);

men när jag kör koden så blir det fortfarande fel, samt är jag osäker om den ska stå efter att man har allokerat minne.

 

Jag har följande kod, på funktionen allocateMemory, allokerar jag minne sedan kallar jag på funktionen i AddItem, dock så vet jag ej om det man frigör minnet i allocatememory eller i Additem och hur man skriver det. Se Bild

 

 

Laguna Online 30711
Postad: 30 okt 2022 20:02

Vad händer efter anropet till addItem? Du ska frigöra först när du är klar med objektet.

Didar 212
Postad: 30 okt 2022 20:12
Laguna skrev:

Vad händer efter anropet till addItem? Du ska frigöra först när du är klar med objektet.

så free funktionen ska vara efter anropet till allocateMemory?

anders_k 237
Postad: 30 okt 2022 21:24 Redigerad: 30 okt 2022 21:25

svårt att se kontexten utan main() så det blir mycket gissande:

ett fel som jag ser är fflush(stdin) det skall man aldrig göra, det är undefined behavior. istället använd funktioner som inte lämnar kvar tecken i bufferten, t.ex. fgets/sscanf.

man skall inte casta pekare som kommer tillbaks från malloc/realloc eftersom de redan returnerar void*, om du får kompileringsfel annars då bygger du koden med en C++ kompilator vilket inte är rätt. 

du läser direkt in i strukturen med fgets, men den kan lägga till en \n på slutet om strängen är mindre än SIZE, det får du nog hantera först.

om du nu måste använda scanf av någon anledning skriv ett mellanslag framför format specifieringen t.ex. " %f" på så vis ignorerar den eventuella \n och mellanslag.

du borde kolla returvärdet på realloc, then kan rerturnera NULL.

du behöver inte ha först malloc och sedan realloc, du kan använda realloc för alla allokeringar, när första argumentet är NULL fungerar den som en malloc.

allocateMemory tar "list" som ett argument, om list är NULL kommer det inte att fungera eftersom funktionen kan inte ändra vad list pekar på, för det måste du ge pekarens adress till funktionen, dvs void addItem(struct ShoppingList** list)

Svara
Close