DİNAMİK BELLEK YÖNETİMİ MALLOC- REALLOC KULLANIMI

Değişken ve Dizilerde tanımlanarak bellekten ayrı lan sabit bel lek alanları büyük çoğunlukla
sorunsuz bir şekilde çalışır ve kullanılır .
Ancak bazı durumlarda, çalışma zamanında bellek ihtiyacı ar tabil ir ya da azalabilir .
Bu gibi durumlarda, çalışma zamanında değişken eklenip çıkarılamayacağı ve sabit dizilerin
boyutu değiştirilmeyeceği iç in dinamik bellek kullanılır .
Dinamik bellek iç in iki tane fonksiyon kullanılabilir . malloc ve free ’dir .
void* malloc(int size);
parametre olarak geçilen size kadar byte heap bellekten yeralır ve başlangıç adresine bir pointer
döndürür. Yer ayrılamaz ise döndürür .

free(void* ptr);
daha önce malloc ile ayrılmış bellek alanının başlangıç adresi parametre olarak veri l ir . Bu bellek
alanı serbest bırakılır .
C’de malloc kullanımı
int *iptr;
iptr = (int*)malloc(sizeof(int)*120);
// 120 yerine değişken tanımlarsak istediğimiz büyüklükte bir dizi tanımlayabiliriz.
…
free(iptr);
realloc() komutu
> Daha önceden alınmış bit belleğin verilerini kaybetmeden boyutunu büyütmek ya da
küçültmek iç in kullanılır .
int *p;
p = (int*)malloc(sizeof(int)*100);
…
int *temp;
temp = (int*)realloc(p,sizeof(int)*150);
if(temp!=NULL)
{
p = temp;
}

 

örnek : Dinamik Bellek(1)

#include <stdio.h>
#include <stdlib.h>
int *pa,*pb,*pc;
int main(int argc, char *argv[]) {
pa = (int*)malloc(sizeof(int));
pb = (int*)malloc(sizeof(int));
pc = (int*)malloc(sizeof(int));
if(pa==NULL || pb==NULL || pc==NULL) {
printf("Yetersiz bellek!\n");
if(pa!=NULL) free(pa); // 15 ve 16 satır kodları aynı anlamdadır...
if(pb) free(pb);
if(pc) free(pc);
return EXIT_FAILURE;
}
*pa = 3;
*pb = 5;
*pc = *pa + *pb;
printf("*pa='%d'\n*pb='%d'\n*pc='%d'\n", *pa, *pb, *pc);
free(pa);
free(pb);
free(pc);
return 0;
}

Örnek 2 :

#include <stdio.h>
#include <stdlib.h>
int *p;
int main(int argc, char *argv[]) {
p = (int*)malloc(sizeof(int)*3);
if(p==NULL) {
printf("Yetersiz bellek!\n");
return EXIT_FAILURE;
}
*(p+0) = 3;
*(p+1) = 5;
*(p+2) = *(p+0) + *(p+1);
printf("*(p+0)='%d'\n*(p+1)='%d'\n*(p+2)='%d'\n", *(p+0), *(p+1), *(p+2));
free(p);
return 0;
21 }

 

Bir yanıt yazın