bugfix> c > 投稿

Cでの動的メモリ割り当ての場合、プログラムを実行およびコンパイルする前に、予約済みメモリの割り当てを解除(または解放)します。例えば:

....
... = malloc(...)
...
free(...)
return 0;

しかし、動的メモリ割り当てを使用しない場合、どのように機能しますか。たとえば、を使用して40000000バイトのスペースを予約した場合 int array [10000000] 、後で必要のないときにプログラムのメモリを解放するにはどうすればよいですか?

回答 3 件
  • Cでメモリを割り当てるにはさまざまな方法があります。

    自動保存期間(別名ローカル変数)-ブロックが入力されると自動的に割り当てられます(関数、 if ステートメント、ループなど)、およびブロックが終了したときに割り当てが解除されます。

    静的ストレージ期間(別名グローバル変数と static ローカル変数)-プログラムの開始時に自動的に割り当てられ、終了時に自動的に割り当て解除されます。

    動的ストレージ期間(別名ヒープ)-割り当てられた malloc と割り当て解除 free

    ちなみに、あなたはしないでくださいプログラムを終了する前に、すべての割り当てを解除する必要があります。オペレーティングシステムは、プログラムが終了すると、プログラムに属するすべてのメモリの割り当てを解除します。 (そうしないと、コンピューターをもっと頻繁に再起動する必要があります)

  • それが呼ばれる場合は理由があります動的メモリ:必要なときにいつでも動的に割り当て/割り当て解除できます。

    また、動的メモリの反対が何かである場合にも理由があります...それは動的ではありません。あなたが言及したような静的配列は割り当てを解除できません。

    必要なのは一生変数の:

    場合 int array [10000000] はグローバル変数であり、その存続期間はプログラムの全存続期間です

    場合 int array [10000000] 中括弧で囲まれたブロック内にあります { } 、スタックに格納され、実行がブロックを終了するとすぐに寿命が終了します

    ブロック内の場合、変数は次のように宣言されます static キーワード( static int array [10000000]; )その寿命は、プログラム全体の寿命でもありますが、範囲ブロックに限定されています

  • For dynamic memory allocation in C, you have deallocate (or free) the reserved memory before you can execute and compile your program.

    それは...混乱しています。動的メモリのみが存在します実行時-プログラムのコンパイルや実行とは何の関係もありません。君は free あなたがもうそれを必要としないときの記憶実行中のプログラムで

    物事はないを使用して割り当て *alloc ..。

    あなたが定義する場合 int array[10000000]; 関数の本体内となしインクルード static キーワード、次に array 持っている自動保存期間;そのためのメモリは、関数に入ると予約され、終了すると解放されます1、2。ファイルスコープで、関数の本体の外で配列を定義する場合、またはで宣言する場合 static キーワード、次に array 持っている静的ストレージ期間また、メモリはプログラムの開始時に予約され、プログラムの終了時に解放されます。


    公式に話すと、メモリは、その変数を入力したときにのみ予約されることが保証されますスコープを囲む-つまり、配列を本体で定義した場合 for ループの場合、メモリはそのループの期間中のみ使用可能であることが保証されます。ただし、実際問題として、ほとんどのコンパイラは、関数の開始時にすべてのローカルにスペースを割り当て、関数の終了時にそれを解放します。

    配列に注意してくださいそれ大きいと、プログラムの実行時にランタイムエラーが発生する可能性があります。個々の関数のローカル変数のストレージは比較的制限されています。

あなたの答え