4

検索を行いましたが、クエリに関連するものは何も見つかりませんでした。現在、C オプティマイザをデバッグしていますが、問題のコードは次のようになります。

while( x-- )
array[x] = NULL;

この場合、どうすればよいでしょうか。そして、このロジックの結果はすべてのコンパイラで一貫しているべきでしょうか?

この場合の x の初期値は 5 であるとしましょう。

問題は、プログラムがクラッシュすることです。私の理解では、負の配列要素参照が原因であると理解しています。

どんな助けでも大歓迎です。

4

3 に答える 3

7

このサイクルは(署名されていると仮定して)x等しいで終了しますが、その本体は最後のステップでへのアクセスを生成しません。最後の配列アクセスはへです。動作はすべての実装で一貫しています。-1xarray[-1]array[0]

つまり、引用したコードでの負のインデックス配列アクセスに問題はありません。array[x]ただし、サイクルの直後にアクセスしようとすると、実際ににアクセスしますarray[-1]

引用したコードは、符号なし変数をインデックスとして使用して配列を逆方向に反復する必要がある場合に使用される、かなりよく知られている実装パターンのバリエーションです。例えば

unsigned x;
int a[5];

for (x = 5; x-- > 0; )
  a[x] = 0;

経験の浅いプログラマーは、配列を逆方向に反復するときに符号なしインデックスを使用するのに問題がある場合があります。(符号なし変数が負の値になることはないため、サイクル終了条件の単純な実装はx >= 0機能しません。)このアプローチ(つまり、サイクル終了条件のポストインクリメント)は、このような場合に機能します。(もちろん、署名されたインデックスでも機能します)。

于 2011-03-21T05:19:16.273 に答える
2

の初期値xが 5 の場合、次のように実行されます。

array[4] = NULL;
array[3] = NULL;
array[2] = NULL;
array[1] = NULL;
array[0] = NULL;

が符号付き型の場合x、 の最終値x-1; それ以外の場合は、型の最大値になります。

于 2011-03-21T05:32:49.583 に答える
0

ループxを処理する前に、負でないことを確認してください (前提条件)。whileまた、プロセスがループを抜けるxとき (事後条件) の値は -1 になります。whileしたがって、ループを終了した後は、 using as インデックスwhileにアクセスしないでください。arrayx

于 2011-03-21T05:28:05.460 に答える