2016-03-28 13 views
0
#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言語で動作するのですか?

+3

通常、グローバル変数は、スタック上ではなく、 'data'セクションまたは' bss'セクションに配置されます。 – owacoder

+1

...これは、グローバル変数が_グローバル_であるためです。 1つの機能だけでは見えません。 – gnasher729

答えて

2

enter image description here

この画像は役立つはずです。スタック上では、ローカル変数と配列、関数呼び出しとポインタに対してのみメモリを割り当てていることがわかります。 グローバル変数/静的変数は、Perm記憶域に格納されます。

+0

"普通"あなたのポストのどこかでいいですね。実際には、これはコンパイラ/リンカに任され、どこにも指定されていません。 Cの仕様では、必要な場所ではなく、ストレージに* requirements *を置くだけです。私はコンパイラのどこかにグローバル変数をスタックの最下位に配置します(つまり、 'main'のスタックフレームを上にして)。 – tofro

2

グローバル変数、静的グローバル変数、および静的変数をスタックに入れる必要はありません。 スタックは、一時的に存在する変数、関数呼び出しに関連する変数、静的変数またはグローバル変数とはまったく反対のもので、メモリエンティティには常に存在し、常に存在します。

また、これはC仕様で記述されているため、静的変数および/または大域変数のデフォルトの初期化はゼロに設定されています。ほとんどの(すべてではないにしても)コンパイラがスタックに入れないので、プログラムの実行時間という点で何の費用もかかりません。

+0

"これはスタックにないためです" - 私はむしろ「C仕様に記述されているので」と言いたいと思います(引用についてはhttp://stackoverflow.com/a/8138702/2564301を参照)。一方、 "スタック"は、C仕様の一部ではありません:http://stackoverflow.com/a/79936/2564301(2番目のコメント)。 – usr2564301

+0

@Rad Lexusそれはいいですか? – jdarthenay

関連する問題