CodeBlanks Logo Icon CodeBlanks

Struct ve union

  • C kursu
  • Orta seviye
  • Ders 38/116
  • 5 dk

Struct içinde union kullanmayı öğrenirsin.

Struct ve union

Bir struct içine union koyarak tagged union (etiketli birleşim) oluşturursun. Etiket, hangi union üyesinin aktif olduğunu söyler. Bu, güvenli union kullanımının standart desenidir.

Örnek: enum Type { INT_T, FLOAT_T };, union Value { int i; float f; }; ve struct TaggedValue { enum Type type; union Value value; };. tv.type = INT_T; ile etiketi, tv.value.i = 42; ile değeri atarsın. Okurken önce type'a bakar, ona göre doğru üyeyi okursun. Bu desen, veri biçimleri, protokol mesajları ve AST düğümleri için yaygındır.

switch ile tür seçimi

Tagged union'dan güvenli okuma yapmak için switch ile etiketi denetlersin. Her case, ilgili üyeyi okur. Bu, yanlış üye okumayı önler.

Örnek: switch (tv.type) { case INT_T: printf("%d\n", tv.value.i); break; case FLOAT_T: printf("%f\n", tv.value.f); break; }. break koymazsan düşme (fall-through) olur; bu genellikle hatadır. default dalı beklenmeyen etiketleri yakalar. Bu desen, gerçek dünya kodunda tagged union'ların standart okuma biçimidir; yorumlayıcılar ve seri dönüştürücüler bunu kullanır.

Uygulama Tagged union ile yazdır

enum Type { INT_T, FLOAT_T };, union Value { int i; float f; }; ve struct TaggedValue { enum Type type; union Value value; }; tanımla. main içinde struct TaggedValue tv; yaz; tv.type = INT_T; ve tv.value.i = 42; ata. switch (tv.type) ile case INT_T: printf("%d\n", tv.value.i); break; ekle.

Başlangıç kodu

main.c
#include <stdio.h>

// enum Type, union Value ve struct TaggedValue tanımla
// main'de tv tanımla, INT_T olarak işaretle, i üyesini 42 yap
// switch ile türü seç ve yazdır

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>

enum Type { INT_T, FLOAT_T };
union Value { int i; float f; };
struct TaggedValue { enum Type type; union Value value; };

int main(void) {
    struct TaggedValue tv;
    tv.type = INT_T;
    tv.value.i = 42;
    switch (tv.type) {
        case INT_T: printf("%d\n", tv.value.i); break;
    }
    return 0;
}

Beklenen çıktı

42

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Tagged union üye erişimi

Soru
struct TaggedValue tv;
tv.type = INT_T;
tv.value____ = 42;
Cevap
struct TaggedValue tv;
tv.type = INT_T;
tv.value.i = 42;

Açıklama: tv.value bir değerdir; .i ile erişilir.

2 Tagged union parçalarını eşle

Kavram Anlamı
enum Type type Etiket alanı
union Value value Değer alanı
switch (tv.type) Tür seçimi
tv.value.i int üye erişimi

3 Tagged union'da etiket neden kullanılır?

  • Derleyici hatası için
  • Bellek tasarrufu için
  • Daha hızlı erişim için
  • Hangi üyenin aktif olduğunu bilmek için Doğru cevap

Açıklama: Etiket, hangi union üyesinin aktif olduğunu söyler.

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