C Programlama

C'DE MALLOC FONKSİYONU NASIL KULLANILIR

C'DE MALLOC FONKSİYONU NASIL KULLANILIR
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, bu nedenle 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 döndüğünde yığın otomatik olarak onu 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 t boyutu tanımlı işaretsiz bir tamsayı olarak. 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. Bellekte saklanacak verilerin türünü bilmeden yalnızca kullanıcı tarafından talep edilen belleği tahsis eder. Bu yüzden geçersiz bir işaretçi döndürüyor.

Malloc sadece bellek tahsis eder, bundan sonra programda düzgün bir şekilde kullanılabilmesi için uygun bir türe 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, o bellekte hangi tür verilerin depolanacağını bilmediğinden, geçersiz işaretçi döndürür.

Burada malloc'tan 6 bayt bellek ayırmasını istiyoruz, eğer başarılı bir malloc geçersiz bir işaretçi döndürürse. 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 üzerinde iki değişken tanımladık. Değişken n, kullanıcı tarafından girilen sayıyı depolayacağı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 verecek. 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 a 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 ile yazılmış bir şey vardır, bildiğimiz gibi, 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ı.

İş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 referansını 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 yorumlanacaktır. Tekrar. Referansı kaldırıyoruz, bu yüzden bize 2'yi vereceknd tam sayı. 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 tamsayı sayısını girmesini istiyoruz ve ardından kullanıcı tamsayıları giriyor ve sadece bunları ekranda görüntülüyoruz.

Sonuç:

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 koşmak. Tekrar malloc işlevini çağıracaklar ve yine bu, yığından bellek ödünç aldıkları ve asla geri dönmedikleri her zaman anlamına gelir, 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 nedenle, malloc free kullanmak ne zaman önemlidir?. Böylece, malloc kullanarak hafızayı koruduk ve malloc, istediğiniz kadar büyük hafıza ayırıyor.

Mutlu dinamik bellek ayırma!

How to reverse Mouse and Touchpads scrolling direction in Windows 10
Mouse and Touchpads not only make computing easy but more efficient and less time-consuming. We cannot imagine a life without these devices, but still...
How to change Mouse pointer and cursor size, color & scheme on Windows 10
The mouse pointer and cursor in Windows 10 are very important aspects of the operating system. This can be said for other operating systems as well, s...
Linux Oyunları Geliştirmek için Ücretsiz ve Açık Kaynaklı Oyun Motorları
Bu makale, Linux'ta 2D ve 3D oyunlar geliştirmek için kullanılabilecek ücretsiz ve açık kaynaklı oyun motorlarının bir listesini kapsayacaktır. Bu tür...