Cで配列を0に初期化する方法は?


170

グローバルとしてCに大きなnull配列が必要です。入力する以外にこれを行う方法はありますか

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


26
char ZEROARRAY [1024] = {0};

3
ヒープにメモリを割り当てる必要がある場合は、calloc()を使用することもできます。たとえば、char * zeroarray = calloc(1024、sizoef(* zeroarray)); 。
Andrei Ciobanu 2010

2
NB calloc charなどは問題ありませんが、ポインターの配列が必要な場合は、明示的にNULLに設定する必要があります。NULLがゼロバイトとして表されるという保証はありません(驚くほど!)。これは、リテラルが0暗黙的にnullポインターを表す場合でもです。
エイドリアン・ラトナパラ2015

回答:


284

グローバル変数と静的変数は自動的にゼロに初期化されます。単純に

char ZEROARRAY[1024];

グローバルスコープでは、実行時にすべてゼロになります。しかし、ローカル配列がある場合、実際に省略構文があります。配列が部分的に初期化されている場合、初期化されていない要素は適切なタイプの値0を受け取ります。あなたは書くことができます:

char ZEROARRAY[1024] = {0};

コンパイラーは、書き込まれていないエントリーをゼロで埋めます。またはmemset、プログラムの起動時に配列を初期化するために使用できます。

memset(ZEROARRAY, 0, 1024);

これは、変更してすべてのゼロにリセットしたい場合に役立ちます。


2
{0}; 正常に動作する、C99 [$ 6.7.8 / 21]ブレースで囲まれたリスト内の初期化子が集合体の要素またはメンバーよりも少ない場合、または既知のサイズの配列を初期化するために使用される文字列リテラル内の文字数が配列の要素、集約の残りの部分は、静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されます
Sasha Zezulinsky

参照してください:初期化された0はではありませんcharacter。それはintegerです。
Yonggoo Noh

1
{}議論は:stackoverflow.com/questions/17589533/...が memset明らかに正しくありません:私はそれが唯一の0のために働くと思う:stackoverflow.com/questions/11138188/...
チロSantilli郝海东冠状病六四事件法轮功

1
構造体の配列であり-Werror=missing-braces、gccで使用する場合は、に初期化する必要があります{{0}}。最初の構造体要素が他の構造体である場合、以下同様に続き{{{0}}}ます。stackoverflow.com/questions/5434865/…を
Tor Klingberg、2017

1
今日、私は奇妙なことに出会いました... int arr[256]={1,2,7,{0}};...私をここに連れてきました。私がそれを見るまで、この部分的なゼロ化が何かであることさえ知りませんでした。
Neil Gatenby

32

配列を0以外の値に初期化する場合は、次のようにしますgcc

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

これは、C99 指定イニシャライザのGNU拡張です。古いGCCでは-std=gnu99、コードのコンパイルにを使用する必要がある場合があります。


14
指定イニシャライザはC99の標準です。...範囲を示すためのの使用は、gcc固有の拡張です。
キーストンプソン

1
これはC99指定の初期化子ではなく、GCC固有の範囲初期化子です。C99標準の代わりにGCCマニュアルを参照する理由は何ですか?
クレイグ・バーンズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.