C de 0 dizisi nasıl başlatılır?


171

Küresel olarak C büyük bir boş dizi gerekir. Bunu yazmanın dışında yapmanın bir yolu var mı

char ZEROARRAY[1024] = {0, 0, 0, /* ... 1021 more times... */ };

?


26
char ZEROARRAY [1024] = {0};

3
Yığın üzerinde bellek ayırmanız gerekirse, calloc () öğesini de kullanabilirsiniz. Örneğin char * zeroarray = calloc (1024, sizoef (* zeroarray)); .
Andrei Ciobanu

2
NB calloc vb.İçin iyidir char, ancak bir dizi işaretçi istiyorsanız, bunları açıkça NULL olarak ayarlamanız gerekir, (saçma!) NULL değerinin sıfır bayt olarak temsil edildiğine dair bir garanti yoktur. Bu, kelimenin tam anlamıyla 0boş göstericiyi temsil etmesine rağmen .
Adrian Ratnapala

Yanıtlar:


285

Global değişkenler ve statik değişkenler otomatik olarak sıfırlanır. Eğer basitçe

char ZEROARRAY[1024];

küresel kapsamda çalışma zamanında hepsi sıfır olacaktır. Ama aslında orada olduğunu yerel dizi olsaydı bir kısaltmadır sözdizimi. Bir dizi kısmen başlatılırsa, başlatılmayan öğeler uygun türde 0 değerini alır. Yazabilirsiniz:

char ZEROARRAY[1024] = {0};

Derleyici, yazılmamış girdileri sıfırlarla doldurur. Alternatif olarak memsetdiziyi program başlangıcında başlatmak için kullanabilirsiniz :

memset(ZEROARRAY, 0, 1024);

Eğer değiştirmiş olsaydınız ve tüm sıfırlara geri döndürmek isteseydiniz bu yararlı olurdu.


2
{0}; iyi çalışıyor, C99 [$ 6.7.8 / 21] Bir küme ayracı içine alınmış listede bir kümenin öğeleri veya üyeleri olduğundan daha az başlatıcı varsa veya bir dizgi değişmezinde bilinen boyutta bir diziyi başlatmak için kullanılandan daha az karakter varsa dizideki elemanlar, toplamın geri kalanı statik depolama süresine sahip nesnelerle aynı şekilde başlatılır
Sasha Zezulinsky

Lütfen bakınız: Başlatılmış 0 a değildir character. bu bir integer.
Yonggoo Noh

1
{}tartışma: stackoverflow.com/questions/17589533/… memset açıkçası doğru değil: Bence sadece 0 için çalışıyor: stackoverflow.com/questions/11138188/…
Ciro Santilli at 冠状 病 六四 事件 法轮功

1
Bu bir dizi yapı ise ve gcc'de kullanılıyorsa -Werror=missing-braces, ilklendirilmesi gerekir {{0}}. İlk yapı elemanı başka bir yapı ise, o zaman {{{0}}}böyle devam eder. Bkz. Stackoverflow.com/questions/5434865/…
Tor Klingberg

1
Bugün int arr[256]={1,2,7,{0}};beni buraya getiren garip ... ... ile karşılaştım . Bu kısmi sıfırlamanın, onu görene kadar bir şey olduğunu bile bilmiyordum.
Neil Gatenby

32

Diziyi 0'dan farklı değerlere başlatmak gccistiyorsanız, şunları yapabilirsiniz:

int array[1024] = { [ 0 ... 1023 ] = -1 };

Bu, C99 Özel Başlatıcıların bir GNU oluşumudur . Eski GCC'de, -std=gnu99kodunuzu derlemek için kullanmanız gerekebilir .


14
Belirtilen başlatıcılar C99'da standarttır. ...Bir aralığı belirtmek için kullanılması, gcc'ye özgü bir uzantıdır.
Keith Thompson

1
Bu C99 için belirlenmiş bir başlatıcı değil, GCC'ye özgü bir aralık başlatıcısı . Neden C99 standardı yerine GCC kılavuzuna bakın?
Craig Barnes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.