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 }