va_start ve va_end
- C kursu
- Orta seviye
- Ders 77/116
- 5 dk
va_start, va_arg ve va_end makrolarını öğrenirsin.
va_start ve va_end yaşam döngüsü
va_start ve va_end bir çifttir: va_start ile başlatılan liste mutlaka va_end ile kapatılmalıdır. Bu, taşınabilirlik ve kaynak temizliği için gerekliidir.
va_start(args, count) çağrısı, args listesini count parametresinden sonraki argümana konumlandırır. Bundan sonra her va_arg çağrısı bir argümanı okur ve konumu ilerletir. Tüm okumalar bitince va_end(args) çağrılır. Bu, bazı platformlarda kaynak temizliği yapar; atlanırsa tanımsız davranış oluşabilir. Bu nedenle va_start gören her fonksiyonda va_end de olmalıdır. Basit bir ilke: her va_start'a bir va_end.
print_numbers örneği
va_arg'ı doğrudan printf içinde kullanabiliriz. Bu, ara değişken olmadan değerleri yazdırır.
Tanım: void print_numbers(int count, ...) { va_list args; va_start(args, count); for (int i = 0; i < count; i++) printf("%d ", va_arg(args, int)); va_end(args); printf("\n"); }. Her döngü adımında va_arg(args, int) bir sonraki tamsayıyı okur ve printf onu yazdırır. Döngüden sonra va_end ile liste kapatılır, sonra yeni satır yazdırılır. Çağrı print_numbers(3, 10, 20, 30) çıktısı 10 20 30 ve yeni satır olur. Boşluk formatında her sayıdan sonra boşluk bırakmak, çıktıyı düzenli tutar.
Uygulama print_numbers fonksiyonu
void print_numbers(int count, ...) yaz. va_list args; va_start(args, count); ile başla. for (int i = 0; i < count; i++) döngüsünde printf("%d ", va_arg(args, int)); çağır. Döngü sonunda va_end(args); ve printf("\n");. main'de print_numbers(3, 10, 20, 30); çağır.
Başlangıç kodu
#include <stdio.h>
#include <stdarg.h>
// print_numbers: count adet int'i boşlukla yazdır, sonunda newline
// va_list tanımla, va_start ile başlat, for ile va_arg oku, va_end ile kapat
// main: print_numbers(3, 10, 20, 30) çağır
int main(void) {
// buraya yaz
return 0;
}Örnek çözüm
#include <stdio.h>
#include <stdarg.h>
void print_numbers(int count, ...) {
va_list args;
va_start(args, count);
for (int i = 0; i < count; i++) {
printf("%d ", va_arg(args, int));
}
va_end(args);
printf("\n");
}
int main(void) {
print_numbers(3, 10, 20, 30);
return 0;
}Beklenen çıktı
10 20 30
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Listeyi kapat
va_____(args);
va_end(args);
Açıklama: va_end(args) listeyi kapatır.
2 va_start çağrılmadan va_arg kullanılırsa ne olur?
- derleme hatası
- tanımsız davranış Doğru cevap
- sıfır döner
- bir önceki argüman okunur
Açıklama: va_start'sız va_arg tanımsızdır; çoğu durumda çöker veya çöp okur.
3 va_ araçları
| Kavram | Anlamı |
|---|---|
va_list |
tip tanımı |
va_start |
konumu hazırla |
va_arg |
değeri oku |
va_end |
kaynağı temizle |