C'DE MALLOC FONKSİYONU NASIL KULLANILIR

How Use Malloc Function C



Malloc, başlık dosyasında bildirilen yerleşik bir işlevdir. Malloc, 'bellek ayırma'nın kısa adıdır ve belirtilen boyuta göre tek bir büyük bitişik bellek bloğunu dinamik olarak tahsis etmek için kullanılır. Statik ve dinamik olmak üzere iki tür bellek ayırma vardır. Statik bellek ayırma, derleme zamanında yapılır ve çalışma zamanında değişmez. Dinamik bellek ayırma, bunun için çalışma zamanında bellek ayırıyor; malloc kullanıyoruz. Şimdi mesele bu hafızanın nereden geldiğidir, yani C'deki tüm dinamik gereksinimler yığın hafızadan karşılanır. Temel olarak uygulamamız/programımız 3 çeşit belleğe sahip olacaktır.

  • Yığın belleği her yöntem için yereldir ve yöntem geri döndüğünde yığın bunu otomatik olarak temizler.
  • Global bellek alanı, tüm global değişkenler için bellek ayırır. Bu hafıza alanı programın başında oluşturulur ve sonunda hafıza alanını otomatik olarak temizler.
  • Yığın bellek, programın/uygulamanın tüm dinamik gereksinimlerini karşılamaya her zaman düşmandır. Malloc işlevini ne zaman kullansak, yığından bir miktar bellek ödünç alacak ve bize ona işaretçiyi verecektir.

Sözdizimi:







malloc'un sözdizimi (void*)malloc(size_t size) şeklindedir. Bu yüzden sözdizimi, malloc'un bir boyut gerektirdiğini söylüyor, işaretçiyi temelde bir geçersiz işaretçi döndürecek ve boyut t, işaretsiz bir tamsayı olarak tanımlandı. Malloc işlevi, boyutun belirtilmesi gereken sözdiziminde görebileceğiniz gibi, yığında belirtilen boyuta göre bir bellek bloğu tahsis eder ve başarı durumunda, ayrılan belleğin ilk baytına işaret eden bir işaretçi döndürür, aksi takdirde NULL döndürür . Bu nedenle, malloc'un işi, çalışma zamanında bellek tahsis etmektir.



Neden geçersiz işaretçi:

Malloc'un neyi gösterdiğine dair bir fikri yok; bu sadece, o bellek konumunda hangi verilerin depolanacağını bilmediği anlamına gelir. Hafızada saklanacak verinin türünü bilmeden sadece kullanıcı tarafından talep edilen hafızayı tahsis eder. Bu yüzden bir boşluk işaretçisi döndürüyor.



Malloc sadece bellek tahsis eder, bundan sonra programda düzgün bir şekilde kullanılabilmesi için uygun bir tipe yazım yapmak kullanıcının sorumluluğundadır. Void işaretçisi, herhangi bir veri türünü işaret edebilen bir işaretçidir, malloc'un geçersiz işaretçisini döndürür, çünkü o bellekte hangi tür verilerin depolanacağını bilmez.





Burada, eğer başarılı bir malloc bir geçersiz işaretçi döndürecekse, şimdi malloc'tan 6 bayt bellek ayırmasını istiyoruz. Bu durumda, bir tamsayıyı o bellekte saklamak istediğimiz için onu bir tamsayı tipi işaretçiye yazmamız gerekir. Burada malloc, bir yığında 6 bayt bellek ayırır ve ilk baytın adresi ptr işaretçisinde saklanır.



Örnek Program:

İşte malloc kavramını doğru bir şekilde anlamak için basit bir örnek program.

Burada printf işleviyle görebilirsiniz, kullanıcıdan tamsayı sayısını girmesini istiyorum. i ve n'nin üzerinde iki değişken tanımladık. Değişken n, kullanıcı tarafından girilen sayıyı tutacağımız yerdir. Bundan sonra malloc fonksiyonumuz var; malloc'un n tamsayı boyutuna eşdeğer boyutlandırmayı tahsis etmesini istiyoruz. int ise boyutu n ile çarpıyoruz; bu bize n tamsayı boyutunu verecektir. Bundan sonra, malloc bir void işaretçisi döndürecek ve onu bir tamsayı işaretçisine yazıyoruz ve adresi ptr işaretçisi içinde saklıyoruz. Typecasting, iyi bir uygulama olduğu için önemlidir.

Şimdi, işaretçi NULL içeriyorsa, bu, belleğin mevcut olmadığı anlamına gelir. Bu yüzden çıkış hatası durumuyla programdan çıkacağız. Eğer durum böyle değilse, for döngüsünü kolayca çalıştırabiliriz.

Döngü 0'dan n-1'e kadar çalışacak ve kullanıcıdan her seferinde birer birer tamsayı girmesini isteyeceğiz. scanf işlevinde, ptr+i yazan bir şey vardır, çünkü ptr'nin belleğin ilk baytının adresini içerdiğini biliyoruz. Diyelim ki burada adres 1000 i başlangıçta sıfıra eşit yani 1000+0 1000 yani bu adreste ilk tamsayımız saklanacak ve bundan sonra i 1 olduğunda 1000+1 yani dahili olarak (1000) +1 olarak yorumlandı *4 Tamsayının boyutunun 4 bayt olduğunu ve 1004'e eşit olacağını varsayarsam, bir sonraki tamsayı 1004 konumunda saklanacaktır. Ve bu şekilde devam edecek adresler 1000, 1004, 1008 vb. ptr+i'den önce ve işareti kullanmıyoruz çünkü ptr yazarken ptr zaten bize adresi veriyor, bu sadece bir işaretçidir ve adresi içerir, değeri değil, dolayısıyla önüne ve işareti koyma zorunluluğu yoktur ve bu kavram açık olmalıdır.

İşte bu döngüde, sadece bir şey yapıyoruz, tüm tamsayıları ekrana yazdırıyoruz; Açıkçası, biz ptr+i kullanıyoruz, ancak burada, bu durumda, ptr+i bir adresi temsil ettiği için referansını kaldırıyoruz, bu yüzden onu kaldırmamız gerekiyor. Eğer i 0'a eşitse 1000 olur çünkü ilk adresin 1000 olacağını varsayıyoruz, dolayısıyla referansını kaldırıyoruz; 1'e eşit ilk tamsayıyı alacağız ve 1001 olacak, ancak tamsayının boyutu 4 ise 1004 olarak yorumlanacak. Referansı kaldırıyoruz, bu yüzden bize 2'yi verecekndtamsayı. Bu şekilde her şey çalışır.

Bu temelde, kullanıcılardan n tamsayı girmelerini isteyen basit bir programdır ve ardından bu tamsayıları ekranda görüntülüyoruz. Programı çalıştırdıktan sonra, bu görüntülenecektir.

İlk olarak kullanıcıdan tam sayıların sayısını girmesini istiyoruz ve ardından kullanıcı tam sayıları giriyor ve biz sadece bunları ekranda gösteriyoruz.

Çözüm:

Yukarıdaki programda çok uzun bir süre devam ettiğimiz sürece yanlış bir şey yok, burada yığından bellek ödünç alıyoruz, ancak belleği asla yığına geri döndürmüyoruz, bu sadece program/uygulamanın çalıştığı durumda olur. 24 saat gibi uzun bir süre çalıştırmak için. Tekrar malloc işlevini çağıracaklar ve bu, yığından her bellek ödünç aldıklarında ve asla geri dönmediklerinde, bu kötü bir programlamadır, bu yüzden geri dönmeden önce free (serbest bırakılması gereken belleğin adresi) yazmalıyız. Bu yüzden ne zaman malloc free kullanmak önemlidir. Böylece, malloc'u kullanarak hafızayı koruduk ve malloc, istediğiniz kadar büyük hafıza ayırıyor.

Mutlu dinamik bellek tahsisi!