3

for ループで配列を宣言することについて、以前に質問しました。

for(i=0;i<=1000;i++){
    float arrayone[(length[i])];
    do a bunch of other stuff
}

基本的に、プログラムが実行されているステップに基づいて長さを変更できる配列を作成しようとしています。配列データは大きく、多くのステップがあるため、(arrayone[][] のように) 配列データを永続的に保存したくありません。

したがって、このようにこのスコープ内でのみ配列を宣言することは合法であると言われました。しかし、最後までに配列の 1000 個のコピーを保存しようとしますが、これは望ましくありません。私は初心者なので、ブロックが実際に何をするのかニュアンスがわかりません。

私にとっての代替手段は、これまでに必要な最大長を持つ配列をループの外側に作成し、すべてのステップでそれを上書きすることです。

編集:配列の用途は次のとおりです。グローバル配列があります。ループ内の配列は、計算を節約するために、そのグローバル配列を使用して関数の結果で埋められます。配列は操作され、...、...、そして最終的にグローバル配列を変更するために使用されます。その後、それらはもう必要ありません。

4

2 に答える 2

7

しかし、最後までに配列の 1000 個のコピーを保存しようとしますが、これは望ましくありません。

いいえ、各反復の開始時に新しい配列が割り当てられ、反復の最後に配列が範囲外になるため、その時点で割り当てが解除されるため、一度に 1 つの配列しか存在しません。

それが自動変数のポイントです(その配列です)。それらが宣言されているスコープの最後で (通常は必ずしも中括弧で区切られているわけではありません)、それらは自動的に割り当て解除されます。

于 2012-04-11T20:23:24.607 に答える
0

ループの各反復が完了すると、配列を含め、ループ内で宣言されたすべての変数が破棄されます。したがって、配列のコピーは 1 つだけ保持されます。

ただし、反復ごとにスタックにメモリを割り当てる必要がないため、ループの外で配列を初期化する方がおそらく優れていることを知っておく必要があります。

次のように配列を動的に割り当てていた場合(例にはありません):

    for(i=0;i<=1000;i++){
      float * arrayone = (float*)malloc(i * sizeof(float));
    }

次に、問題があります。ここで、ローカル変数はポインターであり、破棄されると、割り当てたメモリにアクセスできなくなります。これは、メモリ内に一度に 1000 個の異なる配列が存在することになる場合です。freeポインターが破棄される前に記憶することはできますが、配列をループの外で宣言する方が良いと私は主張します。

于 2012-04-11T20:28:37.367 に答える