可能重複:
Why do these two pointer subtractions give different results?行爲時,類型強制轉換
char arr[] = "stackoverflow";
char *p1 = arr;
char *p2 = arr + 3;
printf("%d", (int*)p2 - (int*)p1);
它的答案是0..Can你解釋爲什麼會這樣呢?
可能重複:
Why do these two pointer subtractions give different results?行爲時,類型強制轉換
char arr[] = "stackoverflow";
char *p1 = arr;
char *p2 = arr + 3;
printf("%d", (int*)p2 - (int*)p1);
它的答案是0..Can你解釋爲什麼會這樣呢?
因爲p2 - p1
是< sizeof (int)
。所以(int *) p2 - (int *) p1 == 0
,這兩個指針之間的元素數量爲int
。
thnx男人,我明白了! woo我只是錯過了da部分:) – vijay
因爲您正在調用實現定義的/未定義的行爲。一個int
可能在您的平臺上的大小爲4,所以至少有一個指針沒有正確對齊。
實際上,這可能是因爲編譯器正在做一些類似於(p2/4) - (p1/4)
的內容。
...甚至是'(p2-p1)&〜3':-) – dasblinkenlight
〜3從哪裏來? – Kylo
是不是隻是平坦的*未定義*的行爲?您正在嘗試對無效指針進行指針運算。 –
我想你大概的意思做的是:
printf("%d", (int)(p2 - p1));
但是,這甚至不需要轉換,因爲兩個指針之間的差異返回一個符號整數類型(ptrdiff_t
),這樣你就可以離開了類型轉換並將"%d"
更改爲"%td"
。
如果你省略了演員,你需要使用't'長度修飾符:'printf(「%td」,p2 - p1);''%d'用於'int'論據。 – ouah
請確保代碼是可編譯的第一個... – kennytm
什麼是'ptr1'? – dirkgently