1

変数がループ内で宣言されている場合、前の宣言はガベージになりますか?たとえば、次のようになります。

loop{

    int array[10];

    array[i]=......

}

arrayループの反復ごとに宣言されます。新しく宣言されたとき、配列が割り当てる新しいメモリの場所は古い場所と同じですか?そうでない場合、割り当てられた領域が解放されないため、古い宣言はガベージになりますか?最後に、上記の例のように配列が静的である場合、ループを終了せずにどのように解放できますか?

4

3 に答える 3

7

実際には何も割り当てていません。これはスタック上で行われ、スタックフレームのサイズはコンパイル時にコンパイラによって計算されます。アレイは、反復ごとに同じ量のスタックスペースを再利用します。はint array[10]実行時に事実上何もしません。

これを行うことで大きな違いがあります:

for (...) {
   int a[10];
   a[0] = x;
}

そしてこれを行う:

for (...) {
  int* a = (int*)malloc(sizeof(int)*10);
  a[0] = x;
  free(a);
}

最初の「割り当て」はサイズが固定されており、費用はかかりません。2つ目は可変サイズにすることができ、手動で解放する必要があるヒープ割り当て配列になります。Cにはガベージコレクションの概念がないため、実際にはガベージになるものはありません。ただし、関数を使用して割り当てたものはすべて解放する必要がありmallocます。その関数を使用したことがない場合は、free何もする必要はありません。コンパイラがそれを処理します。

于 2012-04-19T08:57:01.387 に答える
3

これは、コンパイラが自動的に処理する自動変数です。

newまたはを使用して自分で割り当てるストレージを管理するだけで済みますmalloc。残りはあなたのために処理されます。

array、ループに入るたびにスコープに入り、各ループの終わりに再び破棄されます。コンパイラーは毎回同じスペースを再利用する可能性が非常に高いですが、それは言語によって定義されていません。どちらの方法でもゴミはありません。

于 2012-04-19T09:03:03.203 に答える
0

ループの反復ごとに、新しい配列が作成され、反復の終了時にその配列が破棄されると想定できます。これは、新しく作成された配列のコンテンツが未定義であることを意味します(ガベージの可能性があります-スタック内の同じ場所を占める可能性があるため、同じデータが含まれる可能性が高くなります)

ただし、内部的には、 Dervallint array[10]が指摘したように、割り当てや割り当て解除は行われません。

于 2012-04-19T09:12:56.230 に答える