#include <stdio.h>
int a[100];
int main(){
printf("%d",a[5]);
return 0;
}
上記のコードは常に「0」を出力しますか、それともコンパイラ固有ですか? gcc コンパイラを使用していますが、出力が「0」になりました。
#include <stdio.h>
int a[100];
int main(){
printf("%d",a[5]);
return 0;
}
上記のコードは常に「0」を出力しますか、それともコンパイラ固有ですか? gcc コンパイラを使用していますが、出力が「0」になりました。
はい、 のすべてのメンバーはa
0 に初期化されることが保証されています。
C89 標準のセクション 3.5.7 から
静的記憶域期間を持つオブジェクトが明示的に初期化されていない場合、算術型を持つすべてのメンバーに 0 が割り当てられ、ポインター型を持つすべてのメンバーに null ポインター定数が割り当てられているかのように、暗黙的に初期化されます。
「グローバル変数」は、関数の外側のファイル スコープで定義されます。ファイル スコープで定義されたすべての変数と、キーワードで宣言されたすべての変数には、static storage durationstatic
と呼ばれるものがあります。これは、それらがメモリの別の部分に割り当てられ、プログラムの存続期間全体にわたって存在することを意味します。
また、C コンパイラでゼロに初期化されることが保証されていることも意味します。
現在の C 標準 C11 6.7.9/10 から:
「...静的またはスレッドのストレージ期間を持つオブジェクトが明示的に初期化されていない場合、次のようになります。
— ポインター型の場合、null ポインターに初期化されます。
— 算術型の場合、(正または符号なし) ゼロに初期化されます。"
実際には、これは、グローバル変数を特定の値に初期化すると、その値が設定され、通常は と呼ばれるメモリ セグメントに割り当てられることを意味します.data
。値を指定しない場合は、 という別のセグメントに割り当てられます.bss
。グローバルがスタックに割り当てられることはありません。
はい。グローバル変数は、その型のデフォルト値に初期化されます。
0
はデフォルト値で、任意の型に自動的にキャストされます。ポインタの場合は0
、NULL
グローバル変数は、ゼロに設定されたデータ セグメントにスペースを確保します。
コンパイラ固有ではありませんが、C 標準で定義されています。
したがって、常に 0 が出力されます。
コンパイラ固有ではありません。コードは常に出力されます0
。