C (programlama dili)
Hafıza yönetimi

Bir programlama dilinin en önemli işlevlerinden biri, belleği ve bellekte depolanan nesneleri yönetmek için olanaklar sağlamaktır. C, nesneler için bellek ayırmanın üç temel yolunu sunar:
Statik bellek tahsisi: nesne için alan, derleme zamanında ikili dosyada sağlanır; bu nesnelerin, onları içeren ikili belleğe yüklendiği sürece bir kapsamı(extent) (veya ömrü "lifetime") vardır.
Otomatik bellek tahsisi: geçici nesneler yığında(stack) saklanabilir ve bu alan otomatik olarak serbest bırakılır ve bildirildikleri bloktan çıkıldıktan sonra yeniden kullanılabilir.
Dinamik bellek ayırma: çalışma zamanında, yığın adı verilen bir bellek bölgesinden mallocgibi kitaplık işlevleri kullanılarak isteğe bağlı boyutta bellek blokları istenebilir; bu bloklar, kütüphane işlevi realloc veya free çağrılarak yeniden kullanım için serbest bırakılıncaya kadar devam eder.
Bu üç yaklaşım, farklı durumlarda uygundur ve çeşitli ödünleşimlere sahiptir. Örneğin, statik bellek tahsisi (allocation), çok az tahsis ek yüküne sahiptir. Otomatik tahsis biraz daha fazla ek yük içerebilir ve dinamik bellek ayırma (tahsisi), hem allocation hem de deallocation için potansiyel olarak büyük bir ek yüke sahip olabilir. Statik nesnelerin kalıcı doğası, işlev (fonksiyon) çağrıları arasında durum bilgilerini korumak için kullanışlıdır. Otomatik ayırmanın kullanımı kolaydır, ancak yığın alanı genellikle statik bellek veya yığın alanından çok daha sınırlı ve geçicidir ve dinamik bellek tahsisi, boyutu yalnızca çalışma zamanında bilinen nesnelerin uygun şekilde tahsis edilmesini sağlar. Çoğu C programı, üçünü de kapsamlı bir şekilde kullanır.
Mümkün olduğunda, otomatik veya statik ayırma genellikle en basitidir, çünkü depolama derleyici tarafından yönetilir ve programcıyı potansiyel olarak hataya açık depolamayı manuel olarak tahsis etme ve serbest bırakma görevinden kurtarır. Ancak, birçok veri yapısının boyutu çalışma zamanında değişebilir ve statik ayırmaların (ve C99'dan önceki otomatik ayırmaların) derleme zamanında sabit bir boyutu olması gerektiğinden, dinamik ayırmanın gerekli olduğu birçok durum vardır. C99 standardından önce, değişken boyutlu diziler bunun yaygın bir örneğiydi. (Dinamik olarak ayrılmış dizilerin bir örneği için mallochakkındaki makaleye bakın.) Kontrolsüz sonuçlarla çalışma zamanında başarısız olabilen otomatik tahsisin aksine, dinamik tahsis işlevleri, gerekli depolama tahsis edilemediğinde bir gösterge (boş gösterici değeri şeklinde) döndürür. (Çok büyük olan statik ayırma, genellikle program yürütmeye başlamadan önce bağlayıcı veya yükleyici tarafından algılanır.)
Aksi belirtilmedikçe, statik nesneler program başlangıcında sıfır veya boş gösterici değerleri içerir. Otomatik ve dinamik olarak tahsis edilen nesneler, yalnızca bir başlangıç değeri açıkça belirtilmişse başlatılır; aksi halde başlangıçta belirsiz değerlere sahiptirler (tipik olarak, depolamada hangi bit deseni bulunursa bulunsun, bu tür için geçerli bir değeri bile temsil etmeyebilir). Program başlatılmamış bir değere erişmeye çalışırsa, sonuçlar tanımsızdır. Birçok modern derleyici bu sorunu tespit etmeye ve uyarmaya çalışır, ancak hem yanlış pozitifler hem de yanlış negatifler oluşabilir.
Yığın bellek tahsisi, mümkün olduğunca yeniden kullanılmak üzere herhangi bir programdaki gerçek kullanımıyla senkronize edilmelidir. Örneğin, bir yığın bellek tahsisine yönelik tek işaretçi kapsam dışına çıkarsa veya açıkça tahsis edilmeden önce değerinin üzerine yazılırsa, bu bellek daha sonra yeniden kullanım için kurtarılamaz ve esasen program tarafından kaybedilir, bu bir bellek sızıntısı olarak bilinen bir olgudur. Tersine, belleğin serbest bırakılması mümkündür, ancak daha sonra başvurulmakta ve bu da öngörülemeyen sonuçlara yol açmaktadır. Tipik olarak, hata belirtileri programın hataya neden olan kodla ilgisi olmayan bir bölümünde belirir ve bu da hatanın teşhis edilmesini zorlaştırır. Bu tür sorunlar, otomatik çöp toplama ile dillerde iyileştirilir.