Soru Tarihi
C dilinde dizilerle çalışmak, programlamanın temel bir yönüdür. C, iki ana dizi türü sunar: statik (boyutu derleme zamanında bilinen ve yığında veya statik/ küresel depolama alanında tahsis edilen) ve dinamik (boyutu çalışma zamanında belirlenen). Statik diziler, C dilinin yaratılmasından bu yana kullanılmakta olup, performans ve basitliği vurgular.
Sorun
Statik ve dinamik diziler arasındaki ayrımları anlamamak, dizinin sınırlarını aşma, bellek sızıntıları veya veri yaşam döngüsü yönetimi hataları gibi sorunlarla karşılaşmanıza neden olabilir. Statik dizilerin yanlış bir şekilde başlatılması, atılan veya başlatılmamış verilerin okunmasına yol açabilir.
Çözüm
Statik bir dizinin tanımı şu şekildedir:
int arr[5] = {1, 2, 3, 4, 5};
Bu durumda, dizinin boyutu ve içeriği derleme zamanında belirlenir, bellek yığında (yerel otomatik diziler için) veya statik hafızada (dizinin static olarak veya küresel olarak tanımlanması durumunda) tahsis edilir. Kısmi başlatmalara özellikle dikkat edilmelidir; belirtilmeyen elemanlar sıfırlarla doldurulur.
Statik dizinin boyutunu programın çalışma süresi boyunca değiştirmek mümkün değildir; bu durum onu dinamik olanlardan ayırır.
Ana Özellikler:
1. Bir fonksiyonda statik bir dizi açıkça başlatılmazsa ne olur?
Yerel otomatik (auto) statik dizilerde başlatılmamış elemanlar belirsiz değerlere sahiptir. Ancak, dizi static anahtar kelimesiyle tanımlanmışsa veya küresel olarak tanımlanmışsa, tüm elemanlar varsayılan olarak sıfırlarla başlatılır.
Örnek:
void foo() { int arr1[3]; // Değerler tanımlanmadı! static int arr2[3]; // Tüm elemanlar 0'a eşit }
2. Statik bir diziyi bir fonksiyona, dizinin boyutunu değiştirebilecek şekilde geçirebilir miyiz?
Hayır, statik dizinin boyutunu değiştirmek mümkün değildir; tanımlanırken sıkı bir şekilde belirlenmiştir. Fonksiyon içeriği ile çalışabilir, ancak boyut ile değil.
Dizinin doğru bir şekilde geçirilmesi:
void processArray(int arr[], int size) { arr[0] = 42; }
3. Statik dizinin sınırlarını aşarsak ne olur? Çalışma zamanı hatası meydana gelir mi?
Hayır, C dili dizinin sınırlarının aşılmasını kontrol etmez. Bu tür bir davranış tanımsız davranış olarak kabul edilir ve çökmelere, veri bozulmalarına veya gizli hatalara yol açabilir.
Geliştirici yerel bir dizi tanımlar, başlatmayı unutur ve daha sonra bir döngüde kullanır. Program her çalıştırıldığında farklı sonuçlar verir, bazen okuma aşamasında hata oluşur.
Artılar:
Eksiler:
Geliştirici, diziyi ya değerlerle açıkça başlatır ya da otomatik olarak sıfırlarla başlatılması için static olarak tanımlar. Dizi kullanımı sırasında her zaman boyut ve sınırları kontrol eder.
Artılar:
Eksiler: