2

重複の可能性:
これら 2 つのポインター減算で異なる結果が得られるのはなぜですか?

char arr[] = "stackoverflow";
char *p1 = arr;
char *p2 = arr + 3;
printf("%d",  (int*)p2 - (int*)p1);

答えは 0 です。なぜそうなのか説明できますか?

4

3 に答える 3

4

p2 - p1ですので< sizeof (int)。つまり、 2 つのポインター間の要素(int *) p2 - (int *) p1 == 0の数です。int

于 2012-05-31T17:34:34.853 に答える
3

実装定義/未定義の動作を呼び出しているためです。Anintはおそらくプラットフォーム上でサイズ 4 であるため、これらのポインターの少なくとも 1 つが正しく配置されていません。

実際には、おそらくコンパイラが内部で何かを行っているため(p2 / 4) - (p1 / 4)です。

于 2012-05-31T17:31:08.950 に答える
0

おそらくあなたが意図したことは次のとおりだと思います:

printf("%d",  (int)(p2 - p1));

ただし、2 つのポインターの違いは符号付き整数型 ( ptrdiff_t) を返すため、型キャストを省略して に変更できる"%d"ため、変換は必要ありません"%td"

于 2012-05-31T17:35:27.650 に答える