Statik bellek tahsisi ile dinamik bellek tahsisi arasındaki farkın ne olduğunu bilmek istiyorum?
Bunu herhangi bir örnekle açıklayabilir misiniz?
Statik, otomatik ve dinamik olmak üzere üç tür tahsis vardır.
Statik Tahsis, değişkenleriniz için belleğin program başladığında tahsis edildiği anlamına gelir. Program oluşturulduğunda boyut sabittir. Global değişkenler, dosya kapsamı değişkenleri ve fonksiyonlar içinde tanımlanan static
ile nitelenen değişkenler için geçerlidir.
Otomatik bellek tahsisi fonksiyonların içinde tanımlanan (statik olmayan) değişkenler için gerçekleşir ve genellikle yığın üzerinde saklanır (C standardı yığının kullanılmasını zorunlu kılmasa da). Bunları kullanarak fazladan bellek ayırmak zorunda değilsiniz, ancak diğer yandan bu belleğin ömrü üzerinde de sınırlı kontrole sahipsiniz. Örneğin: bir işlevdeki otomatik değişkenler yalnızca işlev bitene kadar oradadır.
void func() {
int i; /* `i` only exists during `func` */
}
Dinamik bellek tahsisi biraz farklıdır. Artık bu bellek konumlarının tam boyutunu ve ömrünü siz kontrol edersiniz. Eğer belleği boşaltmazsanız, bellek sızıntıları ile karşılaşırsınız ve bu da uygulamanızın çökmesine neden olabilir, çünkü bir noktada sistem daha fazla bellek ayıramaz.
int* func() {
int* mem = malloc(1024);
return mem;
}
int* mem = func(); /* still accessible */
Üstteki örnekte, fonksiyon sonlandırılmış olsa bile tahsis edilen bellek hala geçerli ve erişilebilir durumdadır. Bellekle işiniz bittiğinde, onu serbest bırakmanız gerekir:
free(mem);
Statik Bellek Tahsisi:
Dinamik Bellek Tahsisi:
Statik bellek tahsisi. Ayrılan bellek yığın içinde olacaktır.
int a[10];
Dinamik bellek tahsisi. Ayrılan bellek heap içinde olacaktır.
int *a = malloc(sizeof(int) * 10);
ve C'de Çöp Toplayıcı (GC) olmadığı için ikincisi freed olmalıdır.
free(a);