Blogumda yayınladığım c dilinde bellek yönetimi dersini buraya bırakıyorum. Umarım birilerine faydalı olur. :)

C dili dersleri serisinin bu dersinde c dilinde dinamik bellek yönetiminden(Dinamic Memory Allocation - Dinamik Bellek Allokasyonu) bahsedeceğiz. Dinamik bellek yönetimi ile bellek üzerinde istediğimiz gibi hareket edebiliriz. Sadece c diline ve birkaç makine diline yakın dillere has olan bu özellik ile yer açısından büyük tasarruflar sağlayabiliriz. Şimdi programlama dillerinin makine dili ve günlük konuşma diline yakınlıkları bazında nasıl sınıflandırıldığına bir bakalım.

Programlama dilleri sınıflandırılırken kullanılan yöntemlerden biri dilin makine diline ve günlük konuşma diline yakınlığı ile ilgilidir. Makine dili sadece 0 ve 1 sayılarından oluşan ve sadece bilgisayarın anlayabileceği bir dildir. Programlama dilleri ilk çıktıklarından bugüne kadar giderek sadeleşerek günlük konuşma diline yaklaşmış ve böylece programcılara büyük kolaylıklar sağlanmıştır. Makine diline en yakın olan dil assembly dilidir. Assembly dilinden sonra ise c programlama dili gelir.

C programlama dilinin makine diline yakın olmasının ne gibi avantajları ve dezavantajları vardır? C programlama dili makine diline yakın kabul edilmesinde işlemciye erişim başta gelir. Daha sonra ise birazdan anlatacağımız dinamik bellek yönetimi ve buna benzer bilgisayarın donanımı ile ilgili unsurları yazılım üzerinden kontrol edebildiğimiz için c dili makine diline yakın bir dildir. En büyük dezavantajı ise c dilinin yukarıda bahsettiğimiz özelliklerinin c dilinin kullanımını epey zorlaştırması diyebiliriz. Örnek olarak java dilinde bir dizi oluşturduğunuzda dizinin belleğin hangi kısmında oluştuğu ne kadar yer kapladığı programcıyı ilgilendirmiyor. Şimdi dinamik bellek yönetimini anlatmaya başlayalım.

C Dili Dinamik Bellek Yönetimi



C dilinde dinamik bellek yönetimi ile ilgili şu 4 kavramı inceleyeceğiz. Bunlar malloc, calloc, realloc ve free fonksiyonlarıdır. Bu fonksiyonlar sayesinde hafızadan ihtiyacımız kadar yer ayırabiliriz. Daha sonra ihtiyacımız artarsa bir miktar yer daha ayırabilir ve işimiz bitince kullandığımız alanı işlemciye geri verebiliriz. Malloc fonksiyonu ile başlayalım.

Malloc Fonksiyonu Kullanımı



Malloc fonksiyonu bellekte istediğimiz kadar yer ayırmamıza olanak sağlayan bir fonksiyondur. Bu fonksiyonu kullanırken dikkat edilmesi gereken husus ayrılan yer programcı tarafından tekrar boşaltılmadığı sürece program kapatılsa dahi bilgisayar açılıp kapanmadığı sürece o alan başka bir program tarafından kullanılamaz. Malloc fonksiyonunun kullanımına geçelim.

Örnek:
#include
#include

int main(){
int *p;
p=(int *)malloc(100*sizeof(int));
return 0;
}

Kod Analiz:

- Öncelikle bir adet int tipinde p pointerı tanımladık.
- Burada amacımız 100 tane int boyutunda bir dizi oluşturmak.
- Daha sonra bu pointerı (int *)malloc(100*sizeof(int))'e eşitledik.
- Bunun anlamı malloc ile 100 tane int tipinde alan ayır.
- P pointerı 100 elemanlı dizimizin başlangıç noktasını gösterir. Dizinin herhangi bir elemanına erişmek için normal dizi tanımlamış gibi p[30] şeklinde örnek olarak dizinin 30. elemanına erişebiliriz.

Bellekten yer ayırırken bilmemiz gereken önemli bir husus daha var. Malloc komutunu kullandık fakat o anda bellekte 100 tane int tipinde değer saklayacak kadar boşluk olmamış olabilir. Bu yüzden yer ayrılmış mı kontrolünü yapmamız gerekir. Bu kontrolü ise aşağıdaki kod ile sağlarız.
Dizinin başlangıç adresini saklayan pointer=(Return tipi *)malloc(boyut*sizeof(return tipi))
Örnek:
#include
#include

int main(){
int *p;
p=(int *)malloc(100*sizeof(int));
if(p==NULL){
printf("Yer ayrilamadi.");
}
return 0;
}

Kod Analiz:

- Burada malloc fonksiyonunu kullanarak bellekten yer ayırdık.
- Daha sonra p dizisinin ilk elemanının değerinin (p değeri p[0] ile aynı işlevi görür) NULL karakterine eşit olup olmadığını kontrol ettik.
- Burada p değeri NULL karakterine eşit ise yer ayrılmamıştır.

Peki bellekten yer ayırdık ama oluşturduğumuz bu dizinin elemanlarının şu andaki değeri kaç? Oluşturduğumuz dizinin elemanları malloc fonksiyonu kullandığımızda belleğin o anda o bölüme ne denk geliyorsa o değere sahiptir. Değerleri tanımlarken 0 yapmak için ise calloc fonksiyonunu kullanacağız.

Calloc Fonksiyonunun Kullanımı



Calloc fonksiyonu da malloc fonksiyonu gibi bellekten yer ayırmamızı sağlar. Ancak yukarıda söylediğimiz farkla. Calloc fonksiyonu ile bellekten yer ayırdığımızda ayırdığımız bölgedeki elemanların değeri 0 olur. Calloc fonksiyonu aşağıdaki şekilde kullanılır:
Dizinin başlangıç adresini saklayan pointer=(Return tipi *)calloc(boyut,sizeof(return tipi))
Örnek:
#include
#include

int main(){
int *p;
p=(int *)calloc(100,sizeof(int));
if(p==NULL){
printf("Yer ayrilamadi.");
}
return 0;
}

Kod Analiz:

- Burada yine int tipinde bir p pointerı oluşturduk.
- Calloc fonksiyonu ile bellekten 100 adet int boyutunda alan ayırdık.
- Son olarak ise yer ayrılmış mı kontrolünü dizinin ilk elemanının değeri olan p ile burada p[0]'da kullanılabilir, NULL karakterini karşılaştırarak sağladık.

Realloc Fonksiyonunun Kullanımı



Realloc fonksiyonu daha önceden ayırdığımız yeri genişletmek için kullanılır. Örnek olarak while döngüsü içerisinde bir dizi oluşturmamız gerekirse daha önceden bir boyut tahmini yaparak dizi oluşturmak yerine döngü içerisinde realloc ile her seferinde diziyi büyüterek bu işi halledebiliriz. Realloc fonksiyonunun kullanımı şu şekildedir:
Dizi=(Return tipi *)calloc(dizi,100*sizeof(return tipi))
Örnek:
#include
#include

int main(){
int *p,sayac=0,secim=1,i;
p=(int *)malloc(2*sizeof(int));
if(p==NULL){
printf("Yer ayrilamadi.");
}
while(secim!=0){
printf("Bir deger giriniz:"); scanf("%d",&secim);
p[sayac]=secim;
sayac++;
p=(int *)realloc(p,(sayac+2)*sizeof(int));
}
for(i=0;i printf("%d\t",p);
}
free(p);
return 0;
}

[I]Kod Analiz:


- Malloc fonksiyonu ile 2 int boyutunda bir p dizisi oluşturduk.
- P dizisinin ilk elemanı ile NULL karakterini karşılaştırarak yer ayrılmış mı kontrolünü yaptık.
- Daha sonra while döngüsü içerisinde kullanıcıdan bir değer aldık ve bu değer 0 olmadığı sürece alından değeri dizinin elemanlarına sırasıyla ekledik.
- En sonda ise p dizisini realloc ile 1 int boyutunda genişlettik. (Burada küçük bir analiz daha yapmak gerekirse sayacın değeri başlangıcta 0'dı. Daha sonra 1 olduğunda diziyi sayac+1 kadar yani 2 boyutuna çıkarmış olduk. Böylece kullanıcı yeni bir eleman eklediğinde dizi boyutu 1 artmış olacak.)
- Son olarak ise dizimizi ekrana yazdırdık.

Ekran Görüntüsü:



Free Fonksiyonunun Kullanımı



Dinamik bellek yönetim ile ilgili göz atacağımız son fonksiyon free fonksiyonu. Daha önceden bu fonksiyonlar ile ayırdığımız alanları oluşturduğumuz programdan başka bir program tarafından kullanılamayacağından bahsetmiştik. Ta ki bilgisayar kapatılana kadar yada şimdi göreceğimiz üzere fonksiyon free edilene kadar. Free fonksiyonu bir önceki malloc, calloc ve realloc fonksiyonları ile oluşturduğumuz bellek alanlarını işlemciye geri verir.

Free fonksiyonunun kullanımı çok basittir. Free(boşaltılacak bellek alanı) şeklinde kullanılır.
#include
#include

int main(){
int *p;
p=(int *)malloc(2*sizeof(int));
free(p);
return 0;
}

Yukarıdaki programda ilk önce bellekten malloc fonksiyonu ile 2 int boyutunda yer ayırdık. Daha sonra ise free fonksiyonu ile ayırdığımız yeri boşaltarak işlemcinin kullanımına geri sunduk.

C Dili Dinamik Bellek Yönetimi adlı bu makaleyi beğendiyseniz lütfen yorum yapmayı ve paylaşmayı unutmayın.

Kaynak: Pubtekno