EXAMPLE ile C kütüphanesindeki malloc() Fonksiyonu

⚡ Akıllı Özet

C dilindeki `malloc()` fonksiyonu, çalışma zamanında yığın bellekte bir bellek bloğu ayırır ve ilk baytına işaret eden bir void işaretçisi döndürür; bu sayede programlar, kod gerçekten yürütülene kadar boyutu bilinmeyen bir depolama alanı talep edebilir.

  • ???? Çalışma zamanı tahsisi: malloc() fonksiyonu, derleme sırasında gerekli boyut bilinmediğinde, çalışma esnasında bellek ayırır.
  • ???? Sözdizimi: Bir `cast_type` işaretçisi, taşınabilirlik için genellikle `sizeof` ile boyutlandırılan `malloc(byte_size)`'ı alır.
  • ⚠️ NULL kontrolü: Başarısız bir istek NULL işaretçisi döndürür, bu nedenle işaretçiyi kullanmadan önce sonucu doğrulayın.
  • İşaretçi aritmetiği: Blok bitişiktir, bu nedenle dizi elemanlarına ulaşmak için ++ yerine + kullanın.
  • 🧹 Hafızayı özgür bırakın: Bellek sızıntılarını ve geçersiz işaretçileri önlemek için her bloğu free() ile serbest bırakın.
  • 🤖 Yapay zeka yardımı: Yapay zeka asistanları ve GitHub Copilot, malloc() çağrılarını taslak haline getiriyor ve eksik free() ifadelerini işaretliyor.

C dilinde malloc() fonksiyonu

C'deki malloc nedir?

Malloc() işlevi bellek ayırma anlamına gelir. Bir bellek bloğunu dinamik olarak tahsis etmek için kullanılan bir fonksiyondur. Belirtilen boyutta bellek alanı ayırır ve bellek konumunu gösteren boş işaretçiyi döndürür. Döndürülen işaretçi genellikle void türündedir. Bu, herhangi bir işaretçiye malloc fonksiyonunu atayabileceğimiz anlamına gelir.

C'de malloc nedir

Sözdizimi

ptr = (cast_type *) malloc (byte_size);

Burada,

  • ptr, cast_type'ın bir işaretçisidir.
  • Malloc işlevi, ayrılmış byte_size belleğine bir işaretçi döndürür.
Example: ptr = (int *) malloc (50)

Bu ifade başarıyla yürütüldüğünde 50 baytlık bir bellek alanı ayrılır. Ayrılmış alanın ilk baytının adresi int tipindeki ptr işaretçisine atanır.

Malloc uygulamasının başka bir örneğini düşünün:

#include <stdlib.h>
int main(){
int *ptr;
ptr = malloc(15 * sizeof(*ptr)); /* a block of 15 integers */
    if (ptr != NULL) {
      *(ptr + 5) = 480; /* assign 480 to sixth integer */
      printf("Value of the 6th integer is %d",*(ptr + 5));
    }
}

Çıktı:

Value of the 6th integer is 480

*ptr bildiriminin daha sonra farklı bir veri türüne dönüştürülmesi durumunda kodun daha sağlam olması için sizeof(int) yerine sizeof(*ptr) kullanıldığına dikkat edin.

Bellek yeterli değilse ayırma başarısız olabilir. Bu durumda NULL işaretçisi döndürür. Bu nedenle, NULL işaretçisini kontrol etmek için kod eklemelisiniz.

Tahsis edilen belleğin bitişik olduğunu ve bir dizi olarak ele alınabileceğini unutmayın. Bunu şu şekilde kullanabiliriz: işaretçi Köşeli parantezler [ ] yerine dizi elemanlarına erişmek için + operatörünü kullanmanızı öneririz. Artırma işlemi ++ veya += kullanmak işaretçinin sakladığı adresi değiştirdiği için dizi elemanlarına + operatörünü kullanmanızı tavsiye ederiz.

Malloc fonksiyonu karakter veri tipinin yanı sıra yapılar gibi karmaşık veri tipleriyle de kullanılabilir.

C dilinde malloc() neden kullanılır?

Statik diziler ve sıradan değişkenler, program derlendiğinde boyutlarını sabitler; bu da gereksinim daha küçük olduğunda yer israfına, daha büyük olduğunda ise tamamen başarısızlığa yol açar. `malloc()` bu sorunu çalışma zamanında bellek talep ederek çözer, böylece bir program aldığı veri miktarına tam olarak uyacak şekilde bir arabellek boyutlandırabilir. Bu çalışma zamanı esnekliği, `malloc()`'un kalbinde yer alır. dinamik bellek ayırma C cinsinden

malloc() ile dinamik bellek tahsisi, birçok yaygın durumda doğru tercihtir:

  • Dosya okuma veya kullanıcı tarafından sağlanan liste okuma gibi işlemlerde, program çalışana kadar girdi miktarı bilinmez.
  • malloc() çok daha büyük olan yığından veri çektiği için, sınırlı yığını aşacak kadar büyük bloklara ihtiyaç duyulur.
  • Verinin, onu oluşturan fonksiyondan daha uzun süre varlığını sürdürmesi gerekir, çünkü yığın belleği açıkça serbest bırakılana kadar varlığını sürdürür.
  • Program çalışırken yapılar ve dizilerin büyümesi veya küçülmesi gerekir.

Ayrılan blok bir işaretçi olarak geri verildiği için, temel verileri kopyalamaya gerek kalmadan fonksiyonlar arasında kolayca aktarılabilir.

malloc() ile ayrılan belleği nasıl serbest bırakabilirim?

`malloc()` fonksiyonu tarafından ayrılan bellek, yığın üzerinde bulunur ve asla otomatik olarak serbest bırakılmaz. Bir program serbest bırakmadan sürekli bellek ayırdığında, yavaş yavaş mevcut tüm belleği tüketir; bu durum bellek sızıntısı olarak bilinir. `free()` fonksiyonu, alanın yeniden kullanılabilmesi için sisteme bitmiş bir bellek bloğu döndürür.

`free()` fonksiyonu, `malloc()` fonksiyonunun döndürdüğü işaretçiyi tek bir argüman olarak alır ve tüm bloğu bir kerede serbest bırakır:

int *ptr;
ptr = malloc(10 * sizeof(int));
if (ptr != NULL) {
    /* use the allocated memory here */
    free(ptr);   /* release the block */
    ptr = NULL;  /* avoid a dangling pointer */
}

Dinamik belleği güvenli bir şekilde yönetmek için şu kurallara uyun:

  • Her başarılı malloc() işlemi için free() fonksiyonunu tam olarak bir kez çağırın; aynı bloğu iki kez serbest bırakmak tanımsız davranışa neden olur.
  • Serbest bırakıldıktan sonra işaretçiyi NULL olarak ayarlayın, böylece geçersiz bir işaretçi olarak tekrar kullanılamaz.
  • malloc() tarafından döndürülmeyen bir işaretçiyi, işaretçi aritmetiğiyle kaydırılmış bir işaretçi de dahil olmak üzere, asla free() etmeyin.
  • İşaretçi kapsam dışına çıkmadan önce her tahsis işlemine karşılık gelen bir serbest bırakma işlemi gerçekleştirin.

Keeping C dilinde manuel bellek yönetiminin temel prensibi, bellek tahsisi ve serbest bırakılmasının dengeli bir şekilde yapılmasıdır ve bu, serbest bırakılan belleğin yeniden kullanılmasından kaynaklanan bellek sızıntılarını ve çökmeleri önler.

malloc() ve calloc() arasındaki temel farklar

malloc() ve kalloc() Her ikisi de yığın belleği ayırır, ancak argümanları ve yeni bloğu nasıl ele aldıkları bakımından farklılık gösterirler. malloc() tek bir argüman alır, toplam bayt sayısı, ve içeriği başlatılmamış bırakır, bu nedenle blok, program ona yazana kadar tahmin edilemeyen çöp değerler içerir. calloc() iki argüman alır, eleman sayısı ve her birinin boyutu, ve işaretçiyi döndürmeden önce her baytı sıfıra temizler.

Pratik farklılıklar üç noktaya indirgenebilir:

  • Başlangıç: calloc() belleği sıfırlarken, malloc() sıfırlamaz; bu da değerler zaten üzerine yazılacaksa malloc()'u biraz daha hızlı hale getirir.
  • Tartışma konusu: malloc(n * size) yazarsınız ancak aynı diziyi ayırmak için calloc(n, size) yazarsınız.
  • Kullanım örneği: Temiz ve sıfırlanmış bir blok önemli olduğunda calloc(), hız tercih edildiğinde ve başlatma işlemi manuel olarak yapıldığında ise malloc() tercih edilir.

Her iki fonksiyon da stdlib.h dosyasında tanımlanmıştır, her ikisi de başarısızlık durumunda void işaretçi veya NULL döndürür ve her ikisi de belleklerini aynı free() fonksiyonuyla geri verir.

SSS

C dilinde tür dönüştürme isteğe bağlıdır ve genellikle önerilmez, çünkü void* otomatik olarak herhangi bir nesne işaretçisine dönüştürülür ve açık bir tür dönüştürme, eksik bir stdlib.h dosyasını gizleyebilir. C++Ancak oyuncu kadrosuna ihtiyaç duyulmaktadır.

NULL değeri, isteğin başarısız olduğu anlamına gelir; bu genellikle yetersiz bellekten kaynaklanır. Her zaman işaretçiyi kullanmadan önce kontrol edin, çünkü NULL işaretçisine erişmek tanımsız davranışa yol açar ve genellikle programın çökmesine neden olur.

realloc() fonksiyonu, malloc() ve kee fonksiyonları tarafından önceden ayrılmış bir bloğun boyutunu değiştirir.ping Daha küçük boyuta kadar mevcut verileri işler. Başarısız olursa NULL döndürür ve orijinal bloğu olduğu gibi bırakır, bu nedenle sonucu önce geçici bir işaretçiye atayın.

Bellek sızıntısı, malloc() tarafından ayrılan yığın belleğin free() ile serbest bırakılmaması durumunda meydana gelir. Program, artık kullanmadığı alanı ayırmaya devam eder ve bu da zamanla kullanılabilir belleği tüketebilir.

`malloc()`, bellek alanını yığın üzerinde değil, öbek üzerinde ayırır. Öbek blokları, `free()` çağrılana kadar geçerli kalır, bu nedenle, otomatik yığın değişkenlerinin aksine, onları oluşturan fonksiyondan daha uzun süre varlıklarını sürdürebilirler.

malloc() fonksiyonu void* türünde bir değer döndürür ve bayt sayısını hesaplamak için sizeof fonksiyonuna ihtiyaç duyar. C++ `new` operatörü, tür belirtilmiş bir işaretçi döndürür ve kurucu fonksiyonları çağırır. `malloc()` fonksiyonunu `free()` ile, `new` fonksiyonunu ise `delete` ile birlikte kullanın.

Evet. Yapay zekâ kodlama asistanları malloc() çağrılarını taslak haline getirir, NULL kontrolleri ekler ve eksik free() çağrılarını veya bellek sızıntılarını işaretler; ayrıca işaretçi aritmetiğini açıklayabilirler. Oluşturulan koda güvenmeden önce her zaman derleyin ve test edin.

GitHub Yardımcı Pilotu Niyetinizi açıklayan bir yorumdan malloc(), sizeof() ve bunlara karşılık gelen free() satırlarını önerir. RevDerlemeden önce eksik NULL kontrolleri ve bellek sızıntılarıyla ilgili her öneriyi inceleyin.

Bu yazıyı şu şekilde özetleyin: