char arr[] = "stackoverflow";
char *p1 = arr;
char *p2 = arr + 3;
printf("%d", (int*)p2 - (int*)p1);
答えは 0 です。なぜそうなのか説明できますか?
char arr[] = "stackoverflow";
char *p1 = arr;
char *p2 = arr + 3;
printf("%d", (int*)p2 - (int*)p1);
答えは 0 です。なぜそうなのか説明できますか?
p2 - p1ですので< sizeof (int)。つまり、 2 つのポインター間の要素(int *) p2 - (int *) p1 == 0の数です。int
実装定義/未定義の動作を呼び出しているためです。Anintはおそらくプラットフォーム上でサイズ 4 であるため、これらのポインターの少なくとも 1 つが正しく配置されていません。
実際には、おそらくコンパイラが内部で何かを行っているため(p2 / 4) - (p1 / 4)です。
おそらくあなたが意図したことは次のとおりだと思います:
printf("%d", (int)(p2 - p1));
ただし、2 つのポインターの違いは符号付き整数型 ( ptrdiff_t) を返すため、型キャストを省略して に変更できる"%d"ため、変換は必要ありません"%td"。