60 likes | 194 Vues
This article explains the realloc() function in C programming, which allows for dynamic memory management by resizing previously allocated memory blocks. The function can increase or decrease the memory size and works even if no memory was initially allocated. In case of failure to resize, realloc() will return a NULL pointer. We also provide practical examples to demonstrate realloc's functionality, along with best practices for reading data from files and dynamically managing memory with structures like linked lists.
E N D
Mäluhaldus vol3 Realloc()
Realloc() tööpõhimõte • Realloc funktsioon lubab meil juba varasemalt allokeeritud mälu laiendada ja vähendada. • Realloc töötab ka juhul, kui varemalt pole mälu allokeeritud. • Kui mälu suurendamine samas kohas ebaõnnestub, tagastatakse uue mälu asukoha pointer ja eelnevas mälus olevad andmed kopeeritakse ümber • Kui realloc ebaõnnestub, tagastatakse NULL-pointer. Juhul kui tegu oli juba olemasoleva mälupiirkonna laiendusega, jääb vana pointer kehtima.
realloc(); • Realloc() funktsiooni prototüüp:void* realloc (void* ptr, size_t size); • Tagastus tüüpi void* - viit „uuele“ mälualale • 1. parameeter ptr (void* tüüpi) – viit praegusele mälualale • 2. parameeter size (size_t tüüpi) – uus suurus • ptr=(int*)realloc(NULL, sizeof(int) * n) • ptr2 =(int*)realloc(ptr, sizeof(int) * n)
Näide #include <stdio.h> #include <malloc.h> intmain(void){ int*ptr2=NULL; int*ptr=(int*)malloc(sizeof(int)*100); printf("ptr = %p\n", ptr); ptr2=(int*)realloc(ptr, sizeof(int) * 80000000000); printf("ptr = %p\n", ptr); printf("ptr2 = %p\n", ptr2); free(ptr2); free(ptr); return 0; }
Mõned võimalused failist N kirje lugemiseks • 1. võimalus: rea kaupa lugemine jooksvalt mälu juurde küsides • Iga uue rea lugemisel suurendatakse allokeeritud mälu suurust realloc() funktsiooniga • 2. võimalus: eelnevalt faili suuruse tuvastusega • Kontrollida andmekogus failides (nt ridade kaupa) • Allokeerida mälu vastavalt leitud suurusele • Lugeda andmed mällu • 3. võimalus: rea kaupa lugemine üksteisega lingitud struktuuridesse • Struktuuridele mälu küsimine käib jooksvalt • Struktuurid leitakse üle viitade kaudu vastavalt nimistu ülesehitusele • Tekib linked list (tutvume lähinädalatel)
Tunnitöö • Lugeda failist N kirjet struktuuriga • Erakond (string) • Kandidaat (string) • Häälte arv (int) • Lähtefailis vähemalt 4 erakonda ja 15 kandidaati • Lugemisel allokeerida mälu realloc() funktsiooniga jooksvalt • Ära unusta kontrolle tegemast! • Leia mitu % häältest iga erakond sai • Leia poliitikud, kes said enam kui 5% koguhäältest • Kas mõni erakond jäi alla valimiskünnise (alla 5% koguhäältest)?