Statik yerel değişken, fonksiyon içinde static anahtar kelimesi ile tanımlanır. Normal yerel değişkenlerin aksine, çağrılar arasında değerini korur ve yalnızca bir kez başlatılır. Bu tür bir değişken programın ömrü boyunca var olur, ancak yalnızca kendi fonksiyonu içinde görülür.
Normal yerel değişken:
void func() { int count = 0; // her seferinde başlatılır count++; printf("%d\n", count); }
Her çıkışta — 1.
Statik yerel değişken:
void func() { static int count = 0; // yalnızca bir kez başlatılır count++; printf("%d\n", count); }
Ardışık çağrılarda çıktımız: 1, 2, 3, ...
Kullanım: fonksiyon çağrılarının sayısını saymak, basit değerleri önbelleğe almak için uygundur.
"Statik yerel değişken fonksiyondan çıkarken yok olacak mı ve bir sonraki fonksiyon çağrısında değerine ne olacak?"
Çoğu zaman yok olacak diye cevap verilir, ama bu doğru değil.
Doğru cevap: Statik yerel değişken programın ömrü boyunca var olur. Fonksiyon çağrıları arasında değerini korur ve yalnızca bir kez (fonksiyona ilk girişte veya main'den önce) başlatılır.
Hikaye 1
Bir projede, modüle giriş zamanının göstergeleri bir fonksiyon aracılığıyla ölçülüyordu. int counter = 0; ile static int counter = 0; karıştırıldı - fonksiyon her zaman 1 döndü, istatistik işe yaramaz hale geldi.
Hikaye 2
Bir iş parçacığı güvenli olmayan hizmette, farklı iş parçacıklarından çağrılan bir fonksiyonda statik bir değişken kullanıldı. Bu, yarış durumlarına ve rastgele yanlış sonuçlara yol açtı. Paylaşılan belleğin korunmadığını dikkate almadılar.
Hikaye 3
Dinamik olarak ayrılan bellekteki bir işaretçiyi önbelleğe almak için statik bir değişkende sakladılar. Fonksiyon yeniden başlatıldığında eski belleği serbest bırakmadılar: her çağrıda bellek sızıntısı meydana geldi.