SORU
6 Aralık 2008, CUMARTESİ


Bir Yapı arasındaki farkı ve C Birliği

Herhangi bir iyi örnek struct unionBir bir arasındaki fark vermek var mı? Temelde struct üye tüm bellek kullanır ve union en büyük üyeleri hafıza alanı kullandığını biliyorum. Başka bir OS düzeyde fark var mıdır?

CEVAP
6 Aralık 2008, CUMARTESİ


Bir sendika ile aynı yerde saklı çünkü hepsi unsurlardan birini kullanmak gerekiyor. Bu çeşitli biri olabilecek bir şey saklamak istediğiniz zaman yararlı olur. Bir yapı, diğer taraftan, parçaların her biri için ayrı bir bellek yeri vardır ve hepsi aynı anda kullanılabilir.

Kullanımları somut bir örnek vermek gerekirse, Düzeni bir tercüman, bir süre önce üzerinde çalıştığım ve aslında Düzeni C veri tipleri üzerine veri türleri taklit ediyordum. Bu bir yapı içinde bir numaralandırma değeri yazın ve bu değeri saklamak için bir birlik gösteren saklanması dahil.

union foo {
  int a;   // can't use both a and b at once
  char b;
} foo;

struct bar {
  int a;   // can use both a and b simultaneously
  char b;
} bar;

union foo x;
x.a = 3; // OK
x.b = 'c'; // NO! this affects the value of x.a!

struct bar y;
y.a = 3; // OK
y.b = 'c'; // OK

düzenleme:X ayarı ne olduğunu merak ediyorsanız.b '' değişiklikleri x değeri için c bir, teknik olarak bakılırsa, tanımlanmamış. En modern makinelerde bir char 1 byte ve int 4 bayt x veriyor.b değeri 'c' de x ilk bayt verir.aynı değeri:

union foo x;
x.a = 3;
x.b = 'c';
printf("%i, %i\n", x.a, x.b);

yazdırır

99, 99

Neden iki değeri aynı mı? Int 3 son 3 bayt sıfır olduğu için, bu yüzden de 99 olarak okunur. X için daha büyük bir sayı koyarsak.bir, bu her zaman böyle olmadığını görürsünüz.

union foo x;
x.a = 387439;
x.b = 'c';
printf("%i, %i\n", x.a, x.b);

yazdırır

387427, 99

Gerçek bellek değerleri daha yakından bakmak için izin ayarlamak ve hex değerleri çıktı

union foo x;
x.a = 0xDEADBEEF;
x.b = 0x22;
printf("%x, %x\n", x.a, x.b);

yazdırır

deadbe22, 22

Açıkça 0x22 bu 0xEF üzerine olduğunu görürsün.

AMA

C, int bayt sırasıtanımlı değil.Bu program Mac bilgisayarımda 0x22 ile 0xEF üzerine, ama int, bayt sırası tersine ... çünkü 0xDE yerine üzerine diğer platformlar vardır. Bir program yazarken, bu nedenle, hiç taşınabilir değil çünkü bir Birliği üzerine belirli bir veri davranışını güvenilmemelidir.

Bayt sırası hakkında daha fazla okuma için, endianness check out.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Numberphile

    Numberphile

    15 EYLÜL 2011
  • Rachel Talbott

    Rachel Talbo

    26 Ocak 2011
  • UKF

    UKF

    2 Aralık 2009