#define N 10000000
int arr[N];
int main(void)
{
int i;
for(i=0;i<N;i++)
arr[i]=i+1;
}
なぜグローバルに配列を宣言してもコンパイルエラーが発生しないのですか?スタック内の連続したN * 4バイトのメモリが利用できる可能性はありますか? static
キーワードで配列を宣言するのと同じです。大規模配列のグローバル宣言はどのようにC言語で動作するのですか?
#define N 10000000
int arr[N];
int main(void)
{
int i;
for(i=0;i<N;i++)
arr[i]=i+1;
}
なぜグローバルに配列を宣言してもコンパイルエラーが発生しないのですか?スタック内の連続したN * 4バイトのメモリが利用できる可能性はありますか? static
キーワードで配列を宣言するのと同じです。大規模配列のグローバル宣言はどのようにC言語で動作するのですか?
"普通"あなたのポストのどこかでいいですね。実際には、これはコンパイラ/リンカに任され、どこにも指定されていません。 Cの仕様では、必要な場所ではなく、ストレージに* requirements *を置くだけです。私はコンパイラのどこかにグローバル変数をスタックの最下位に配置します(つまり、 'main'のスタックフレームを上にして)。 – tofro
グローバル変数、静的グローバル変数、および静的変数をスタックに入れる必要はありません。 スタックは、一時的に存在する変数、関数呼び出しに関連する変数、静的変数またはグローバル変数とはまったく反対のもので、メモリエンティティには常に存在し、常に存在します。
また、これはC仕様で記述されているため、静的変数および/または大域変数のデフォルトの初期化はゼロに設定されています。ほとんどの(すべてではないにしても)コンパイラがスタックに入れないので、プログラムの実行時間という点で何の費用もかかりません。
"これはスタックにないためです" - 私はむしろ「C仕様に記述されているので」と言いたいと思います(引用についてはhttp://stackoverflow.com/a/8138702/2564301を参照)。一方、 "スタック"は、C仕様の一部ではありません:http://stackoverflow.com/a/79936/2564301(2番目のコメント)。 – usr2564301
@Rad Lexusそれはいいですか? – jdarthenay
通常、グローバル変数は、スタック上ではなく、 'data'セクションまたは' bss'セクションに配置されます。 – owacoder
...これは、グローバル変数が_グローバル_であるためです。 1つの機能だけでは見えません。 – gnasher729