C – Dynamic Memory Allocation

  • 3 sene önce, Baran EKREM yazdı.
  • 0 Yorum
  • 471 Kişi Okudu

Bu yazıda Dynamic Memory Allocation yani “Dinamik bellek tahsisi” konusundan bahsedeceğim. “Dinamik bellek yönetimi, Dinamik dizi tanımlama” gibi tanımlamalarda bu konunun içinde olacak. Konunun amacı bellekte bizim belirlediğimiz boyutta programımıza özel bir hafıza alanı ayırıp kullanmak ve gerekirse bu alanı genişletebilmek daha sonra işimiz bittiğinde alanı temizleyip serbest bırakmak.

 

Bu konuda inceleyeceğimiz fonksiyonlar

  • malloc();
  • calloc();
  • realloc();
  • free();

İlk olarak malloc bize belirlediğimiz tür ve boyutta bir alan ayırmamızı sağlar. Kullanımı ise şöyledir.

Not : Bu yazıda int türü değişken 2 Byte olarak kabul edilmiştir !

Şimdi bir örnek üzerinde kullanımını inceleyelim.

Kullanıcıdan aldığımız değere göre alan tahsis etme işlemi böyle yapılabilir. Burada dikkat edilmesi gerek unsurlardan biri malloc fonksiyonuna verdiğimiz parametredir. Parametre olarak tanımlanacak olan alanın türünün boyutu ile kaç adet olacağınız çarpımı olmalıdır. Sanırım karmaşık bir tanımlama oldu ama şöyle izah edebiliriz. Eğer biz 10 adet char türünü tutmak isteseydik parametre olarak 10 yazmamız yeterliydi. Yani bize 10 Byte’lık bir alanı tahsis edecekti.

Fakat ben 10 adet int türünde veri saklamak istiyorum o zaman 10 yazmam doğru olur muydu ? Maalesef hayır. Bunun sebebi int türünün 2 Byte olmasıdır. yani benim 10*2=20 byte alana ihtiyacım olurdu. Bu yüzden bu işlemi şöyle yapabilirim.

Bu koddaki sizeof(int); bana parametre olarak verdiğim türün (int) kaç byte olduğunu döndürecektir. Böylece 10*2=20 byte alan tahsis etmiş olurum.

İkinci olarak calloc fonksiyonuna bakalım. Bu fonksiyonda kullanım olarak ufak bir fark vardır. 2 parametre alır. Ayrılacak olan alan ve ayrılacak olan alanın türü yani malloc da yaptığımız 10 * size işlemini calloc ile 2 parametre halinde yaparız.

Kendi içinde bu iki parametreyi çarparak bize gerekli alanı tahsis eder. Peki bu fonksiyonun tanımlanması hariç malloc’dan farkı olabilir ? Oldukça basit calloc ayırdığı alana başlangıç değeri olarak 0 verirken malloc bunu yapmaz. Bu yüzden calloc yapısı daha sık kullanılır ve kullanılmalıdır.

Malloc ile yapılan bir örnek;

Calloc ile yapılan bir örnek;

Gördüğünüz gibi memset fonksiyonu ile alanı temizlemeye gerek kalmadı. Unutmadan bu fonksiyonları kullanırken “type casting” yapmayı unutmayalım. Çünkü bu fonksiyonların dönüş tipi (void *) şeklindedir.

Değinmemiz gereken 3. fonksiyon ise realloc. Bu fonksiyon bize daha önceden malloc yada calloc ile tahsis ettiğimiz alanı yeniden boyutlandırmayı sağlar. Bu fonksiyon ise 2 parametre alır birincisi eski alan ikincisi ise yeni boyutu.

Daha önceden tanımladığımız 10 Bytelı bir alana daha sonra 10 Byte daha eklemek istesen şu şekilde yapabiliriz.

Burada array önce 5*2 Byte boyutunda daha sonra realloc ile 10*2 Byte lık olarak yeniden boyutlandırılıyor. Tabi realloc başlangıç değeri vermez bunu sizin memset ile yapmanı gerekmektedir.

Son olarak bu kullandığımız alanlar ile işimiz bittiğinde bunları serbest bırakmamız gerekir ki o da free fonksiyonu ile yapılır. Oldukça basit bir kullanımı vardır tek parametre alır buda ayırdığınız alandır.

Bu şekilde dinamik bellek yönetiminin temellerini öğrenmiş olduk. Bir sonraki yazıda bu öğreninlenleri bir uygulama ile pekiştirmek gerçekten iyi olur.

Esen Kalın.

Bir Yorum Yazın