1

定義した「ヘッダー」構造体の配列の長さを見つけようとしています (ここで関連する場合、ヘッダーはいくつかの情報を提供する int メンバーを保持するだけです)。fl、配列の先頭へのポインター、および配列の末尾に配置されてidxいる適切なポインターがどこにあるかを示すインデックス値を渡すことでこれを試みfl_tailsます (他の/繰り返しの言葉では、「fl_tails[idx]」は最後へのポインタ):

int arr_size(header* fl, int idx){

  int cnt = 1; /* Anything passed guaranteed to have at least 1 */ 

  while(fl != fl_tails[idx]){
    fl++; 
    cnt++;
  }
}

これで最後までポインタを進めてカウントをきちんと生成するだけかと思ったのflですが、無限ループに陥ってしまいます。これは、この機能の何かが原因なのか、それとも他の場所で見つけなければならないことが原因なのか疑問に思っています。先頭と末尾のアドレスを unsigned int として出力したところ、それぞれ 16777216 と 16777344 のように無害に見えました。headerたぶん、構造とそのサイズ/ステップへの影響についての私の理解にも何か問題がありますか?

4

4 に答える 4

1

while ループを見ています。メモリ アドレスをインデックスの値と比較しています。これは常に true と評価されます。これが無限ループに陥っている理由だと思います。

配列の長さについては、 sizeof() 演算子/関数の使用を検討しましたか。

于 2013-02-11T03:47:02.640 に答える
1

アドレスを比較したいので、次のようにします。

while(fl != &fl_tails[idx])
            ^
于 2013-02-11T03:44:59.053 に答える
0

問題はfl_tails[idx]、別のポインター型を返し、別のポインター型でflあることです。それらは同じ場所を指すことは決してないので(ユニオン内にない限り)、プログラムは無限ループに入ると思います。

于 2013-02-11T03:54:06.567 に答える
0

次のことを覚えておいてください。

 while(fl != fl_tails[idx])

次と同等です。

 while(fl != *(fl_tails + idx))

したがって、(fl_tails + idx) はポインターであり、*(fl_tails + idx) はこのポインターを逆参照して、それが指している値を取得しているため、ポインター fl を実際の値と比較しています。

したがって、ポインターアドレスを比較して配列の末尾を見つけるだけの場合は、次のように変更します。

while(fl != &fl_tails[idx])

ポインタとポインタを比較しているように。

取得した値に関する限り、指示先のないポインターは、初期化された値 (古いプログラムの古い値) を保持する指示先を持つことができることを覚えておいてください。このビデオを見ることをお勧めします:

http://www.youtube.com/watch?v=f-pJlnpkLp0

于 2013-02-11T03:56:42.640 に答える