CodeBlanks Logo Icon CodeBlanks

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

main.c
#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

main.c
#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

Soru
va_____(args);
Cevap
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

Orta seviye bölümündeki tüm dersler