Derleyici değerleri nasıl doldurur char array[100] = {0};
? Arkasındaki sihir nedir?
Derleyicinin nasıl başlatılacağını bilmek istedim.
Derleyici değerleri nasıl doldurur char array[100] = {0};
? Arkasındaki sihir nedir?
Derleyicinin nasıl başlatılacağını bilmek istedim.
Yanıtlar:
Sihir değil.
Bu kodun C'deki davranışı, C spesifikasyonunun 6.7.8.21 bölümünde (C spesifikasyonunun çevrimiçi taslağı) açıklanmaktadır. : belirli bir değere sahip olmayan elemanlar için, derleyici NULL'a ve aritmetik türleri sıfıra ( ve bunu topaklara yinelemeli olarak uygular).
C ++ 'da bu kodun davranışı, C ++ spesifikasyonunun (C ++ spesifikasyonunun çevrimiçi taslağı ) bölüm 8.5.1.7'sinde açıklanmıştır : derleyici, belirli bir değere sahip olmayan elemanları ilklendirir.
Ayrıca, C ++ 'da (C değil) boş bir başlatıcı listesi kullanabileceğinizi ve derleyicinin dizideki tüm öğeleri toplamasına neden olduğunu unutmayın:
char array[100] = {};
Bunu yaparken derleyicinin ne tür bir kod üretebileceğine gelince, şu soruya bir göz atın: 0 başlatma dizisinden garip montaj
Uygulama derleyici geliştiricilerine bağlıdır.
Sorunuz "bu tür bir bildirimle ne olacak" ise - derleyici, ilk dizi öğesini verdiğiniz değere ayarlar (0) ve diğerleri, atlanan dizi öğeleri için varsayılan bir değer olduğu için sıfıra ayarlanır.
Derleyiciniz GCC ise, aşağıdaki sözdizimini de kullanabilirsiniz:
int array[256] = {[0 ... 255] = 0};
Lütfen http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits adresine bakın ve bunun derleyiciye özgü bir özellik olduğunu unutmayın .
Bu başlatmayı nereye koyacağınıza bağlıdır.
Dizi olduğu gibi statik ise
char array[100] = {0};
int main(void)
{
...
}
o zaman programın veri segmentinde 100 0 bayt ayıran derleyicidir. Bu durumda başlatıcıyı atlamış olabilirsiniz.
Diziniz otomatikse, başka bir hikaye.
int foo(void)
{
char array[100] = {0};
...
}
Bu durumda foo işlevinin her çağrısında gizli bir memsetiniz olacaktır.
Yukarıdaki kod şuna eşdeğerdir:
int foo(void)
{
char array[100];
memset(array, 0, sizeof(array));
....
}
ve başlatıcıyı atlarsanız diziniz rastgele veriler (yığının verileri) içerir.
Yerel diziniz aşağıdaki gibi statik olarak bildirilmişse
int foo(void)
{
static char array[100] = {0};
...
}
teknik olarak birincisi ile aynı durumdur.