Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem dynamicka alokace C, retezce

Funkcia strncpy tam ten ukončovací znak nevloží, ak je kopírovaný reťazec dlhší. Len zabezpečí, aby sa neprekopírovalo viac znakov než zadáš.

V manuáli si môžeš prečítať, že funkciu free môžeš zavolať na výsledkoch funkcie malloc, calloc alebo realloc. V opačnom prípade, alebo v prípade ak si už free zavolal, je správanie programu nedefinované. Ak zavoláš free na NULL, nič sa nevykoná.

Takže áno, prvé volanie free(p) je správne, pretože adresa bola získaná malloc-om. Po tomto volaní smerník p ukazuje na miesto, ktoré bolo uvoľnené. Ak po tomto volaní priradíš do smerníka p hodnotu NULL, tak stratíš odkaz na to uvoľnené miesto, čo je v poriadku.

Ak by si však predtým nezavolal free a rovno priradil NULL, tak by to už v poriadku nebolo. Stratil by si totiž možnosť tú pamäť uvoľniť. Nič strašné by sa nemuselo stať, pretože po ukončení procesu ju operačný systém uvoľní za teba. Ak však program alokuje pamäť bez jej uvoľňovania, tak sa môže stať, že ju celú postupne vyčerpá.

Volanie free(r) je nesprávne, pretože o pamäť pre "no nazdarek" sa stará niekto iný. Navyše, tieto statické reťazce sa môžu alokovať v pamäti určenej len na čítanie, takže nie len že tú pamäť neuvoľníš, ale nebudeš do nej vedieť ani zapísať (závisí od prekladača).

Priradenie NULL do r je v poriadku. Stratíš síce odkaz na "no nazdarek", ale ak ti to nevadí, tak je to ok. V tomto prípade k žiadnemu úniku pamäte nedojde.

Reakce na odpověď

1 Zadajte svou přezdívku:
2 Napište svou odpověď:
3 Pokud chcete dostat ban, zadejte libovolný text:

Zpět do poradny