Ö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;
}