Bir dizinin tüm üyeleri aynı değere nasıl başlatılır?

C'de büyük bir dizim var (bir fark yaratacaksa C++ değil). Tüm üyeleri aynı değerle başlatmak istiyorum. Bir zamanlar bunu yapmanın basit bir yolunu bildiğime yemin edebilirim. Benim durumumda memset() kullanabilirdim, ancak bunu yapmanın C sözdiziminde yerleşik bir yolu yok mu?

Çözüm

Bu değer 0 olmadığı sürece (bu durumda başlatıcının bir kısmını atlayabilirsiniz ve karşılık gelen elemanlar 0 olarak başlatılacaktır), kolay bir yol yoktur.

Yine de bariz çözümü göz ardı etmeyin:

int myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };

Eksik değerlere sahip öğeler 0 olarak başlatılacaktır:

int myArray[10] = { 1, 2 }; // initialize to 1,2,0,0,0...

Yani bu, tüm öğeleri 0 olarak başlatacaktır:

int myArray[10] = { 0 }; // all elements 0

C++'da, boş bir başlatma listesi de her öğeyi 0 olarak başlatacaktır. C'de buna izin verilmez:

int myArray[10] = {}; // all elements 0 in C++

Statik depolama süresine sahip nesnelerin, herhangi bir depolama süresi yoksa 0 olarak başlatılacağını unutmayın. başlatıcı belirtilmiştir:

static int myArray[10]; // all elements 0

Ve "0" mutlaka "all-bits-zero" anlamına gelmez, bu nedenle yukarıdakileri kullanmak memset() işlevinden daha iyi ve daha taşınabilirdir. (Kayan nokta değerleri 0'a ilklendirilmiş, null değerine işaretçiler, vb.)

Yorumlar (17)

Yukarıda ayrıntılı olarak açıklandığı gibi tüm statik başlatıcı şeyini yapabilirsiniz, ancak dizi boyutunuz değiştiğinde gerçek bir serseri olabilir (diziniz büyüdüğünde, uygun ekstra başlatıcıları eklemezseniz çöp alırsınız).

memset, işi yaptığınız için size bir çalışma zamanı isabeti verir, ancak doğru yapılan hiçbir kod boyutu isabeti dizi boyutu değişikliklerine karşı bağışık değildir. Dizinin birkaç düzine elemandan daha büyük olduğu neredeyse tüm durumlarda bu çözümü kullanırdım.

Dizinin statik olarak bildirilmesi gerçekten önemli olsaydı, programı benim için yazması için bir program yazardım ve bunu derleme sürecinin bir parçası haline getirirdim.

Yorumlar (1)

Normal veri türlerini (int dizileri gibi) başlatmak için ayraç gösterimini kullanabilirsiniz, ancak dizide hala boşluk varsa sondan sonraki değerleri sıfırlayacaktır:

// put values 1-8, then two zeroes
int list[10] = {1,2,3,4,5,6,7,8};
Yorumlar (0)