4

メモリを動的に割り当てる場合、たとえば、要求を満たすのに十分なメモリがない場合malloc(1024 * sizeof(char))、結果のポインタが に設定されます。NULL

などの静的割り当てを満たすのに十分なメモリがない場合はどうなりchar c[1024]ますか?

4

1 に答える 1

5

char c[1024]必ずしも静的割り当てではありません。宣言が関数の本体内 (static修飾子なし) に記述されているか、トップレベルに記述されているかによって、静的または自動になります。

プログラムの実行中に割り当て用のスペースが予約されるため、静的割り当ては実行時に失敗することはありません。十分なメモリを予約できない場合、プログラムはロードに失敗します ( exec*Unix では失敗します)。異常なケースでは、メモリが OS によってオーバーコミットされる可能性があり、システムはアクセスされた場合にのみメモリを予約します。その場合、割り当てに失敗すると、プロセスがシステムによってすぐに強制終了れます。

自動割り当ては、通常、スタック ポインター レジスタをデクリメントすることによって、スタックのエッジを下に移動するだけです。(これが、ローカル変数の割り当てが非常に高速である理由です。) AC プログラムには、スタックが大きくなりすぎたことを検出するための移植可能なメカニズムがありません。一部のオペレーティング システムでは、割り当てられた制限を超えたことを MMU が検出すると、スタックが自動的に拡張されます。Linux はメイン スレッドに対してこれを行いますが、プロセス内の他のスレッドに対しては行いません。それでも、十分なスタック割り当ては遅かれ早かれシステムの制限を超えるか、システムのメモリを使い果たし、プログラムは失敗します。

システムに応じて、プログラムはセグメンテーション違反ですぐに失敗するか、スタックとヒープの開始が一致したときに発生するメモリの破損で終了します。

于 2012-11-18T10:44:10.837 に答える