C Yazılımlarında Bellek Ayırma
Önceki Yazılım Verisine Saklama Alanı Ayrılması Sonraki
C Yazılımlarında Bellek Ayırma
C dili, C yazılımlarındaki değişkenler için iki çeşit bellek ayırma işlemini destekler:
Durağan bellek ayırma
Bir durağan (static) veya genel (global) değişken tanımında durağan ayırma yapılır. Her durağan veya genel değişken sabit uzunlukta bir bellek bloğu tanımlar. Bu blok, yazılım ilk çalıştırıldığında bir kere ayrılır ve asla serbest bırakılmaz (durağan özelliği).
Özdevinimli bellek ayırma
Bir işlev argümanı ya da bir yerel değişken gibi bir özdevinimli bir değişken için özdevinimli bellek ayırması uygulanır. Bir özdevinimli (automatic) değişken için bellek alanı bir birleşik deyim bildirimine girildiğinde ayrılır ve birleşik deyimin çalışması sona erdiğinde serbest bırakılır. GNU C'de bir özdevinimli saklama alanının uzunluğu bir ifade ile belirtilebilir ve değiştirilebilir. Diğer C gerçeklemelerinde bu uzunluk bir sabit olmalıdır.
Bir üçüncü bellek ayırma türü ise C değişkenleri tarafından desteklenmeyen ama GNU C kütüphanesi üzerinden kullanılabilen özdevimli bellek ayırmadır.
Özdevimli Bellek Ayırma
Özdevimli (dynamic) bellek ayırma, yazılımların çalışması sırasında bazı bilgilerin saklanmasını sağlayan bir tekniktir. Yazılımınızın bir bellek ihtiyacı olduğunda ancak ne kadar bellek ihtiyacı olacağı baştan belli olmayan durumlarda bu teknik faydalıdır.
Örneğin, bir girdi dosyasından okunan bir satırı saklamanız gerekebilir; bir satırın uzunluğunun belli bir sınırı olmadığından belleği özdevimli olarak ayırmanız ve satırdan daha fazlasını okumanız gerekirse özdevimli olarak bu alanı büyütmeniz gerekir.
Veya, bir veri girdisi olarak her kayıt ya da her tanım için bir blok gerekebilir; bunlardan kaç tane olacağını baştan bilemeyeceğinizden, her yeni kayıt için yeni bir blok veya her yeni tanım okunduğunda bir blok ayırmanız gerekir.
Özdevimli bellek ayırması kullandığınızda, bir bellek bloğunun ayrılması yazılımın doğrudan doğruya istediği bir eylemdir. Alanı ayırmak istediğinizde ayırmak istediğiniz uzunluğu bir argüman olarak belirterek bir işlev ya da bir makro çağırırsınız. Bu alanı serbest bırakmak istediğinizde ise başka bir işlev ya da makroyu çağırırsınız. Tüm bu işlemleri ne zaman ve ne sıklıkta gerekiyorsa yapabilirsiniz.
Özdevimli ayırma C değişkenlerince "dynamic" isminde bir saklama sınıfı olmadığından desteklenmez ve özdevimli ayrılmış alanda saklanan değerin atandığı bir C değişkeni asla olamaz. Özdevimli ayrılmış bellek almanın tek yolu bir sistem çağrısı üzerinden almak (bu sistem çağrısı genellikle GNU C kütüphanesinin bir işlevi üzerinden yapılır) ve ona erişmenin tek yolu da bir gösterici kullanmaktır. Daha az kullanışlı olduğundan ve özdevimli bellek ayırma işlemi daha fazla hesaplama gerektirdiğinden özdevimli ayırma sadece durağan ya da özdevinimli bellek ayırma uygulanamadığında kullanılır.
Örneğin, bir struct foobar için özdevimli olarak bellek ayırması yapmak isterseniz, bu alandaki içerik için struct foobar türünde bir değişken bildiremezsiniz. Ama struct foobar * gösterici türünden bir değişken bildirebilir ve bu alanın adresini ona değer olarak atayabilirsiniz. Sonra da * ve -> işleçlerini kullanarak bu alandaki içeriğe erişirsiniz:
{
  struct foobar *ptr
    = (struct foobar *) malloc (sizeof (struct foobar));
  ptr->name = x;
  ptr->next = current_foobar;
  current_foobar = ptr;
}
Önceki Üst Ana Başlık Sonraki
Yazılım Verisine Saklama Alanı Ayrılması Başlangıç Özgür Bellek Ayırma
Bir Linux Kitaplığı Sayfası