2

私は初心者で、以下の例を使用して配列へのポインターの概念を理解しようとしています。ループの終了条件を教えてもらえますか?
while ループは永久に実行されているように見えますが、プログラムは何も出力せずに終了します。
ありがとうございました。

typedef struct abc{
    int a;
    char b;
} ABC;

ABC *ptr, arr[10];

int main()
{
    ptr = &arr[0];
    int i;
    for(i = 0; i < 10; i++){
        arr[i].a = i;
    }
    while(ptr!=NULL){
        printf("%d \n", ptr->a);
        ptr++; //Can I use ptr = ptr + n to skip n elements for some n?
    }
}
4

2 に答える 2

0

ループは無限ではなく、ptr == 0 のときに停止します。32 ビット コンピュータを使用していると仮定すると、ptr は 32 ビット幅です。したがって、0 から 4294967296-1 (0 から 2 ^ 32 -1) までの数値を保持できます。ループを通過するたびに、ptr に 8 が加算されます。最終的に ptr は 4294967296-8 になります。これに 8 を加えると 4294967296 になりますが、これはオーバーフローであるため、実際の結果は 0 です。

注: これは、PTR がたまたま 8 の倍数で開始した場合にのみ機能します。オフセットを 4 にすると、無限ループになります。

printf を "%d" から "%x" に変更します。数値を 16 進数で表示すると、より明確になると思います。

于 2013-09-22T15:43:53.947 に答える