C'de Dinamik Bellek Kullanımı

  • 29-10-2020 01:13
  • 2471

Bilgisayarlarda  yazdığımız programları çalıştıran ve bellek yönetimini yapan işletim sistemidir. Program içinde tanımladığımız değişkenlere ve dizilere ait bellekler program çalıştığı anda işletim sistemi tarafından ayrılır. Basit uygulamalar için bu yeterli olsa da dosya okuma ya da veriler üzerinde yapılacak işlemler için bellek ihtiyacı ortaya çıkınca malloc ve calloc fonksiyonlarını kullanarak işletim sisteminden belirttiğimiz miktarda bellek talebinde bulunabiliriz. Eğer kaynaklar yeterli ise işletim sistemi istediğimiz uzunlukta belleği programın kullanması için ayırır ve bize belleğin başlangıç adresini verir. Kullanıdığımız bellekle işimiz bitince bu belleği 'free' fonksiyonu ile sisteme geri verebiliriz.

C'de malloc Kullanımı

malloc standart kitaplıkta stdlib.h dosyası içinde tanımlı bir fonksiyondur. malloc fonksiyonu ile işletim sisteminden bellek talebinde bulunuruz. Fonksiyon yalnızca bellek uzunluğunu parametre olarak alır, dönüş değeri ise ayrılmış belleğin başlangıç adresidir hata durumunda ise NULL değeri döndürür.

Örnek malloc kullanımı 1:


veri
=(char *)malloc(10);

 

Yukarıdaki malloc örneğinde 10 baytlık bellek sistemden isteniyor ve fonksiyonun dönüş değeri veri değişkenine kaydediliyor. Fonksiyon başındaki (char * ) ifadesi dönüş değerini char tipinde pointera çeviriyor. Bunu yapmamızın nedeni malloc fonksiyonunun dönüş tipinin void tipinde pointer olmasıdır. Bu değeri kendi kullandığımız veri tipine dönüştürmeliyiz.

 Örnek malloc kullanımı 2:

#include <stdio.h>
#include <stdlib.h>

int main(){
    char * veri;
    int i;
    int veri_uzunlugu=10;
    
    //Veri uzunluğunun 1 fazlası uzunlukta bellek alınıyor.
    veri=(char *)malloc(veri_uzunlugu+1);
    
    if(veri==NULL){
        //İstenen uzunlukta bellek alınamazsa hata mezajı yazılıyor ve programdan çıkılıyor.
        printf("Bellek hatası.\n");
        return 1;
    }
    
    //veri dizisinin içeriğine A harfi yazılıyor
    for(i=0;i<veri_uzunlugu;i++){
        veri[i]='A';
    }
    //Dizinin son elemanına 0 değer verilerek string sonlandırılıyor.
    veri[i]=0;
    
    //Dizi içeriği ekrana yazdırılıyor.
    printf("%s",veri);
    
    //Alınan bellek geri veriliyor.
    free(veri);
    
    return 0;
}

 

calloc Kullanımı

calloc fonksiyonu malloc ile aynı işlemi yapar ek olarak ayrılan belleği temizler bunu da belleğin her baytına 0 kaydederek yapar. Ayrıca malloc fonksiyonundan farklı olarak calloc 2 farklı parametre alır. İlk parametre eleman sayısı ikinci parametre ise bir elemanın bayt cinsinden uzunluğu. Örneğin int tipinde uzunluğu 100 olan bir dizi için bellekten calloc kullanarak yer ayırmak istersek bunu aşağıdaki gibi yapabiliriz.

Örnek calloc kullanımı:

   
int * dizi; dizi=(int *)calloc(100, sizeof(int));

 

Örnekte kullanılan sizeof veri tiplerinin uzunluklarını bulmak için kullanılan bir oparatördür. Burada ise int veri tipinin uzunluğunu bulmak için kullanılıyor. Bayt cinsinden ayrılan belleği hesaplamak için eleman sayısı ve bir elemanın uzunluğunu çarpmamız gerekir. Örnekte 100*sizeof(int) olarak hesaplayabiliriz.

realloc Fonksiyonu

realloc fonksiyonu malloc ya da calloc fonksiyonu ile ayırdığımız belleği yeniden boyutlandırmamızı sağlar. Parametre olarak daha önce ayırdığımız belleğin başlangıç adresi ve bayt cinsinden ayırmak istediğimiz bellek miktarını alır dönüş değeri ise yeni ayrılan belleğin adresi, hata olması durumunda ise NULL değeri döner.

Örnek realloc Kullanımı:

    
int * dizi; dizi=(int *)calloc(10, sizeof(int)); dizi=(int *)realloc(dizi,100*sizeof(int));


free Fonksiyonu

malloc ya da calloc fonksiyonu ile sistemin program için ayırdığı belleği sistem kaynaklarına geri aktarır. Parametre olarak ayrılmış belleğin başlangıç adresini alır, dönüş değeri yoktur.