12
Mar'11

C ‘de malloc, calloc, free, realloc Fonksiyonları (C Programlama Dili)

Bellek kullanımı, bir programcı için her zaman çok önemli olmuştur.Yazılan program ne kadar az işlemci ve bellek tüketirse o kadar iyidir.C programlama dilinde de bellek tüketimini azaltmak ve ihtiyacımız kadar bellek kullanımı için bazı fonksiyonlar mevcut.

Birkaç ufak örnek ve açıklamalarla bu fonksiyonların kullanımlarına bakalım.

Programlamada diziler en çok kullandığımız bellek tahsis etme yöntemlerinden biridir.Fakat dizilerin boyutları  bir değişken ile tanımlanamaz.Bu da dizilere, gereğinden fazla yer tahsis edecek boyutlar girmemizi gerektiriyor.İşte tam bu noktada malloc ve calloc işimizi görebilir.

malloc(); calloc();

Her iki fonksiyon da bellekten istediğimiz miktarda yer almayı sağlar.Kullanımlarında çok ufak bir fark vardır.

dizi1=(geri döndürülecek veri tipi *) malloc(ayrılacak alan*sizeof(veri tipi));
dizi2=(geri döndürülecek veri tipi *) calloc(ayrılacak alan,sizeof(veri tipi));

şeklinde malloc fonksiyonu ile bellekten yer alabiliriz.Ufak bir örnek olarak;

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

main(){

   int *dizi,i;

   dizi=(int*) malloc(20*sizeof(int));

   for(i=0;i&lt;20;i++){//bu dizinin elemanlarına erişim.
      *dizi=i;//i'yi dizi pointerinin bulunduğu adresdeki değere ata.

      printf("%d\n",*dizi);

      dizi++;//dizi pointerinin adresini 1 arttır.
   }

   getch();
}

verilebilir.

Malloc ve calloc ile çok boyutlu diziler de tanımlayıp, tanımladığımız dizilerin elemanlarına çok kolay bir şekilde ulaşabiliriz.

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

main(){

   int **matris,i,j;//dizi işaretçisi ** ile tanımlandı çünkü satır ve o satıra ait stunun elemanlarını işaret edecek.Birnevi pointerin pointeri diyebiliriz.

   matris=(int **)malloc(3*sizeof(int));//3 satırlı bir matris olacağını bu şekilde belirliyoruz.

   for(i=0;i&lt;4;i++){//4 döngü 4 stun olacağı anlamına gelir.

      matris[i]=(int *)malloc(3*sizeof(int));

   }//4 defa 3 tane satır tanımlandı.matris[3][4].12 elamanlı.

   for(i=0;i&lt;3;i++)

      for(j=0;j&lt;4;j++){

         printf("%d.%d eleman :",i,j);

         scanf("%d",&amp;matris[i][j]);//Aynı dizilerdeki mantık ile elemanlara ulaşabiliriz.

      }

   getch();
}

Malloc ve calloc fonksiyonlarını struct yapısıyla iletişimli halde tanımlayabiliriz.

struct eleman{

int sayi;

char isim;

};

main(){

   eleman *adres=(eleman*) malloc(sizeof(struct eleman));

   //bunu bir dizi haline getirmek için ise sadece boyutunu belirlemek yeterli.

   //eleman *adresDizisi=(eleman*) malloc(X*sizeof(struct eleman)); x tane eleman kaydi tutan bellek bölgesi ayrıldı.

}

realloc();

realloc fonksiyonu ise daha önceden calloc veya malloc ile tahsis etmiş olduğumuz bellek bölgesine ekleme yapmak, ayırdığımız alanı büyütmek için kullanılır.Kullanımı ise şu şekildedir;

yeniAlan = (int*) realloc (eskiAlan,100*sizeof(int));

free();

Malloc veya calloc ile ayırdığımız bellek bölgesi ile işimiz bittiğinde o alanları serberst bırakmak için kullanılan fonksiyondur.

Diyelim ki malloc ile “dizi” işaretçisiyle bir alan ayırdık.İşimiz bitti ve o alanı artık kullanmayacağız.Yapmamız gereken;

free(dizi); komutunu eklemektir.

  • Cem Demir

    Eline sağlık Turgay, bayadır yazmıyodun iyi oldu bu.

    • Turgay Özgür

      Şu sıralar daha sık yazmaya gayret edeceğim.Teşekkürler Cem.

  • Orhun

    Eline sağlık eyvallah :)

  • Oğuzhan

    Teşekkürler ;)

  • murat

    Allah razı olsun çok temiz ve net…

  • muhendis adayi

    ubuntuda geany kullanıyorum conio.h kutuphanesi için fatal error veriyo geany bu kutuphaneyi içermiyo mu

    • Turgay Özgür

      Bildiğim kadarıyla conio.h kütüphanesi windows için tanımlanmış. getch(); fonksiyonunu kullanmak istiyorsanız ubuntuda bu komutun işini yapan başka bir fonksiyon vardı.
      conio.h yerine #include <iostream> tanımlayın ve getch(); yerine cin.get kullanmayı deneyin.

    • gcey

      conio.h ubuntuda mevcut değil. kullanmak conio.h kütüphanesini indir ve /usr/include dizinine at.
      include dizininde standart c kütüphaneleri bulunmaktadır…

  • Ali Eren Çelik

    Realloc fonksiyonu sadece alan büyütmeye değil alan küçültmeye de yaramaz mı :)

Yeni makaleleri E-Mail ile takip edin!