2010-10-07 15 views

cevap

9

Belirtilmemiş tüm alanlar sıfırlanır. Yani burada bir dizi yapı var. Dizinin ilk elemanını, yapının ilk elemanını sıfırlayan bir yapı başlatıcısı ile başlatıyorsunuz. İlk yapının geri kalan kısmı ve dizi elemanlarının geri kalanı da sıfır olacaktır. Güzel bir deyim.

+0

Sadece bunu doğru anladığımdan emin olmak için. Belirtilmemiş tüm alanlar sıfır olarak başlatıldığından, '= {{0}}' aslında hiçbir etkisi olmaz? –

+2

Bir etkisi var. Özel olarak ilk öğeyi sıfıra başlatır ve sonra öğelerin geri kalanını örtük olarak sıfır olarak başlatır. {{0}} öğesini atladıysanız, bir fonksiyonun içinde (yığınta) bildirdiyseniz rastgele çöp alırsınız. (Bunu bir global olarak ilan ederseniz ve {{0}} değerini atlarsanız, aynı zamanda farklı nedenlerden ötürü de sıfır olacak şekilde başlatılacağını unutmayın.) – xscott

3

Bu, başlatılan yuvalanmış parantez değildir. Dış parantezler bir dizi başlatılır olduğunu belirten edilmektedir: bu yana

struct mystruct s[10] = {   }; 

yapıların bir dizidir, her yapıları, bundan başka parantez ile başlatılabilir: sadece ilk üç element

struct mystruct { int x, y, z}; 

struct mystruct s[10] = { {0, 1, 2}, // <-- initializes s[0].x, s[0].y, s[0].z 
          {1, 2, 3}, // <-- initializes s[1].x, s[1].y, s[1].z 
          {2, 3, 4} // <-- initializes s[2].x, s[2].y, s[2].z 
}; 

Not olduğu başlatıldı. C standardına göre geri kalan 7 eleman 0 olarak başlamalıdır. Bu sizin de kodunuza ne olur. xscott onun cevapta belirtildiği gibi gösterildiği gibi, başlatıcı listesinde ihmal herşey 0.

3

için başlatılır? dizi, yapı, vb - - parantez kendi seviye içinde

Temel olarak, her bileşik tipi zarfın içine koymalıdır.

düşünün:

struct mystruct 
{ 
    int i; 
    double d; 
    char s[10]; 
    int a[5]; 
} s[10] = 
{ 
     { 0, 0.0, "abc", { 1, 2, 3, 4, 5 } }, 
     { 1, 1.0, "def", { 2, 3   } }, // Partially initialized array 
     { 2, 2.0, { 'x', 'y', 'z' }, { 0 } }, // Strings are a shorthand 
[9] = { 9, 99, 0,  { 9, 8, 7, 6, 5 } }, // C99 - initialize row 9 
}; 

Ama (kötü, arkaik uygulama) ısrar ederseniz siz de parantez atlayabilirsiniz:

struct mystruct t[3] = 
{ // You cannot avoid using these outside braces 
    0, 0.00, "abc", 1, 2, 3, 4, 5, // Omitted braces 
    1, 1.11, "bcd", 2, 3, 4, 5, 4, 
    2, 2.34,      // Omitted values 
}; 

Herhangi atlanmış ilklendiriciler sıfır olarak kabul edilir.

+0

Parantezleri kullanmanın avantajı, parçaların başlatılmasını iptal etmenize izin vermesidir. Bazı üyelerin (daha sonra örtük olarak sıfırlanacak) daha sonraki üyeleri başlatmaya devam ederken. '{' X ',' y ',' z '}' i kullanmanız, bunun bir örneğidir. –

0

İç köşebentler isteğe bağlı olsa da, derleyici, açılış ayraçlarının yalnızca gereken yerlerde görünmesini ve yuvalanmış öğenin çok fazla başlatıcı içermediğinden emin olmak için kontrol edecektir. Ayrıca, bir yapı bazı alanları bırakabilir ve yapı dizinin sonunda olmasa bile derleyiciyi otomatik olarak sıfırlar. Uygulamaların, bunların yönetilmesinde verimliliğinde farklılık gösterdiğine dikkat ediniz; Bazıları başlatma kaydını küçük parçalara bölerken, diğerleri kodun içine çok sayıda sıfır ekler. Diğerleri üç nispeten küçük 'const-init' kayıtları üretecek Bazı derleyiciler, const verilerin 3K değerinde üretecek

 
typedef struct { 
    char name[8]; 
    char more_stuff[1016]; 
} THINGIE; 
THINGIE my_array = {{"Fred"},{"George"},{"Mark"}}; 

: gibi Örneğin, her yapı görünüyordu. İnsanların C'yi anlayamadıkları pek çok şeyi gösteren bir soru için

+0

Derleyici, açılış ayraçlarının yalnızca "olması gereken" yerde görünüp görünmediğini kontrol edemez, çünkü bunlar her yerde geçerlidir. Bu bile geçerli C: 'int x = {0};'. –

+0

Yapı tanımınızdan önce "typedef" anahtar kelimesini çıkardınız. Yukarıdaki kodunuzda, THINGIE bir değişken değil, bir türdür. – xscott

+0

@ R: Doğru; Doğrulama aldığınız yerde, iki veya daha fazla şeyi bir parantez içine koymaya çalışırsanız. Eminim "int x = {0,1};" yasal değildir. – supercat