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"
。