Union (birleşim), aynı bellek alanında farklı değerleri saklayan özel bir veri tipidir. Union'daki tüm üyeler bellek içinde aynı adreste yer almaktadır ve bellek boyutu en büyük üyenin boyutuna eşittir.
Kullanım:
Örnek:
union Data { int i; float f; char s[4]; }; union Data d; d.i = 0x41424344; // artık bellekte okunabilecek 4 byte var, int, float, string olarak okunabilir printf("%c%c%c ", d.s[0], d.s[1], d.s[2]); // üreticiye özgü çıktı
Tuzaklar ve kullanım kuralları:
Soru: Union kullanmanın anlamı, neden birden fazla alan içeren bir yapı (struct) kullanmıyoruz?
Cevap: Union kullanımı bellek tasarrufu sağlar çünkü bir anda içinde sadece BİR değer saklanır, hepsi aynı anda değil. Bir yapıda her alan için bellek ayrılırken, union'da yalnızca en büyük alan için belleğe ihtiyaç vardır, diğerleri bu belleği "paylaşır". Ayrıca, union veri temsilini aynı bellek parçasında güvenli veya kasıtlı bir şekilde dönüştürmeyi mümkün kılar.
Örnek:
struct S { int i; float f; } s; // sizeof = sizeof(int) + sizeof(float) union U { int i; float f; } u; // sizeof = max(sizeof(int),sizeof(float))
Hikaye
Bir cihaz sürücüsü projesinde, "donanım" ile bağlantı union ile bit seviyeli veri erişimi sağlanıyordu. Küçük bir yeniden düzenlemeden sonra, geliştirici union'daki yanlış alana yazmaya başladı, bu da geçersiz verilere okuma yapmaya ve sistemin kritik hatalar vermesine neden oldu, çünkü union'da her an yalnızca bir alan "gerçek"ti.
Hikaye
Ağa paket alışverişi sırasında union kullanarak bellek yönetimi uygulayan geliştirici, yapıların hizalamasını göz ardı etti. Sonuç olarak bir byte kayma meydana geldi ve yapı yanlış kaymalarla ayrıştırıldı, bu da protokolün orijinal ile uyumsuz hale gelmesine neden oldu.
Hikaye
Bir seri hale getirme kütüphanesi üzerinde çalışan programcı, union'ı bir işlev üzerinden değer olarak geçirirken, okumadan önce gerekli alanı başlatmayı unutmuştu. Bu nedenle veriler yanlış bir şekilde seri hale getirildi, çıkış akışında atık oluştu ve orijinal bilgilere geri dönmek mümkün olmadı.