Değişken uzunluklu diziler (VLA – Variable Length Arrays), C99 standardında ortaya çıkmıştır, daha önce tüm dizi boyutları derleme aşamasında bilinmeliydi. Sadece çalışma zamanında bilinen bir değişkene bağlı olarak dizi boyutunun belirlenmesine olanak tanır.
VLA'nın yanlış kullanımı, bellek ayırma hatalarına (örneğin, çok büyük bir dizi boyutu stack overflow'a neden olur) yol açabilir, VLA'nın farklı derleyiciler arasında geçişinin mümkün olmaması (hepsi desteklemiyor), ve daha eski C ve C++ standartlarıyla sınırlı uyumluluk sorunları yaratabilir. Ayrıca, hata ayıklama, belleğin stack üzerinde ayrılması ve heap üzerinde değil olması nedeniyle zorlaşır; bu her zaman beklenmeyen bir durumdur.
VLA kullanırken, bunların stack üzerinde yaşadığını ve global veya statik olamayacaklarını unutmamak gerekir. Gerekirse C++ ile garanti edilen etkileşim ve esneklik için malloc üzerinden dinamik dizileri tercih etmek daha iyidir. VLA desteği garanti edilmediğinde, statik diziler veya C90 standartları ile sınırlı kalmak uyumluluk için gereklidir.
Koda Örnek:
#include <stdio.h> void process(size_t n) { int arr[n]; // VLA for(size_t i = 0; i < n; i++) arr[i] = i; for(size_t i = 0; i < n; i++) printf("%d ", arr[i]); } int main() { process(5); return 0; }
Ana Özellikler:
Fonksiyon içinde static int arr[n]; şeklinde bir değişken uzunluklu statik dizi tanımlamak mümkün mü?
Hayır, statik değişkenlerin derleme aşamasında belirli bir boyutları olmalıdır. Bu nedenle static int arr[n]; değişken boyutu hatası oluşturacaktır.
VLA'lar fonksiyondan çıkıldığında otomatik olarak serbest bırakılacak mı?
Evet, VLA'lar stack üzerinde ayrılır ve blok/fonksiyondan çıkıldığında, normal yerel değişkenler gibi otomatik olarak belleği serbest bırakır.
Çok büyük boyutlu bir VLA ayırmak güvenli mi?
Hayır, stack boyutu sınırlıdır (örneğin, 1 MB veya 8 MB). Büyük bir VLA ayırma girişimi çalışma zamanında hata (stack overflow) verir.
VLA ile çok platformlu bir kod yazdık, kod eski veya sıkı yapılandırılmış derleyicilerde derlenmedi.
Artılar:
Eksiler:
VLA'yı yalnızca yerel görevler için ve burada küçük bir boyut garantisi olduğunda kullandık; büyük diziler için malloc/free tercih edildi.
Artılar:
Eksiler: