100 likes | 240 Views
Mäluhaldus Vol2. Risto Heinsar & Ott Madis Ozolit. Usalda, kuid kontrolli!. Mälu on piiratud ressurss Eelmine kord küsisime mälu, kuid mis juhtub, kui meil seda piisavalt pole? #include < stdio.h > #include < malloc.h > int main ( void ) { int * ptr1 , * ptr2 ;
E N D
Mäluhaldus Vol2 Risto Heinsar & Ott Madis Ozolit
Usalda, kuid kontrolli! • Mälu on piiratud ressurss • Eelmine kord küsisime mälu, kuid mis juhtub, kui meil seda piisavalt pole? #include <stdio.h> #include <malloc.h> intmain(void){ int*ptr1, *ptr2; ptr1=(int*)malloc(sizeof(int)*100); ptr2=(int*)malloc(sizeof(int)*50000000000000000); printf("ptr1 adr = %p\nptr2 adr = %p", ptr1, ptr2); free(ptr1); free(ptr2); return 0; }
Usalda, kuid kontrolli! • Mälu on piiratud ressurss • Eelmine kord küsisime mälu, kuid mis juhtub, kui meil seda piisavalt pole?
Näide 1 – Mälu allokeerimisekontroll #include <stdio.h> #include <malloc.h> #include <stdlib.h> intmain(void){ int*ptr; ptr=(int*)malloc(sizeof(int)*50000000000000000); if(!ptr) { printf("Pole piisavalt mälu"); exit(0); } return 0; }
calloc(); Calloc() funktsiooni prototüüp:void* calloc (size_tnum, size_t size); • Tagastus tüüpi void* - viit allokeeritud mälule • 1. parameeter num (size_t tüüpi) – mitu elementi • 2.parameeter size (size_t tüüpi) – mitu baiti on üks element • Erinevalt malloc() funktsioonist, initsialiseerib calloc() kogu küsitud mälu nullidega!Realisatsioon:ptr=(int*)calloc(n, sizeof(int));
Näide 2 - calloc intmain(void){ int*ptr,i; ptr=(int*)calloc(5,sizeof(int)); for(i = 0; i < n; i++) printf("%d\n", *(ptr+ i)); return 0; }
realloc(); • Realloc() funktsiooni prototüüp:void* realloc (void* ptr, size_t size); • Tagastus tüüpi void* - viit „uuele“ mälule • 1. parameeter ptr (void* tüüpi) – viit mälule • 2. parameeter size (size_t tüüpi) – uus suurus • Realloc funktsioon lubab meil juba allokeeritud mälu laiendada ja vähendada. Juhul, kui see võimalik pole, tagastatakse NULL. • Realloc töötab ka juhul, kui varemalt pole mälu allokeeritud. • ptr2 =(int*)realloc(ptr, sizeof(int) * n)
Näide 3 – realloc() #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; }
Näide 4 – realloc() #include <stdio.h> #include <malloc.h> intmain (void) { intn, i, *massiiv, *suuremMassiiv; printf("Mitunumbritmassiiv?\n> "); scanf("%d", &n); massiiv= (int*)malloc(sizeof(int) * n); for(i= 0; i< n; i++) scanf("%d", (massiiv+ i)); for(i= 0; i< n; i++) printf(" > %d\n", *(massiiv+ i)); printf("Mitunumbrituusmassiiv?\n> "); scanf("%d", &n); suuremMassiiv= (int*)realloc(massiiv, sizeof(int) * n); for(; i< n; i++) scanf("%d", (suuremMassiiv+ i)); for(i= 0; i< n; i++) printf(" > %d\n", *(suuremMassiiv+ i)); return 0; }
Tunnitöö • Loed failist sisse andmed struktuuriga (malloc) • Char ISBN kood • Char pealkiri • Char autor • Int eksemplaride arv • Lubad kasutajal sisestada täiendavaid kirjeid mällu (realloc) • Enneprogrammi lõppu väljasta uus seis!