2012-03-12 46 views
3

減法指針是否指向C中有效的相同數組的不同元素?減法指針是否指向C中有效的相同數組的不同元素?

下面的東西是否保證按照C標準工作?我依稀記得,這是無效的嗎?

int * a; 
int * b; 
a = (int*) 100; 
b = (int*) 200; 
printf("%d\n", b-a); 

這會不會給我25

+1

從技術上講,即使將一個隨機整數賦值給一個指針也是無效的標準C。 – Random832 2012-03-12 18:57:17

+0

即使定義了它,指針減法也會產生'ptrdiff_t'類型的結果,而''%d「'需要'int'參數。最後一行應該是'printf(「%d \ n」,(int)(b-a));'。 – 2012-03-12 19:02:26

+1

@ Random832:取決於「有效」的含義。這不是未定義的行爲。 [N1570](HTTP://www.open-std。org/jtc1/sc22/wg14/www/docs/n1570.pdf)6.3.2.3p5:「一個整數可以轉換爲任何指針類型,除了前面指定的,結果是實現定義的,可能沒有正確對齊,可能不會指向引用類型的實體,並且可能是陷阱表示。「但這很可能是無稽之談。 – 2012-03-12 19:04:07

回答

5

從C規格,附錄J.2 未定義行爲

指針不點進去,或者只是超越,相同的數組對象相減(6.5.6)。

6.5.6加法運算符,第9段表示:

當兩個指針相減,既應指向同一陣列對象的元素,或一個過去的所述陣列的最後一個元素目的;結果是兩個數組元素的下標差異。

你有它 - 你的例子導致未定義的行爲。也就是說,在大多數系統中,它會工作得很好。您可能想要更改您的printf格式爲%td以表明您正在打印ptrdiff_t類型。

3

這是不確定的行爲。

其中之一,這些指針不指向你擁有的內存。

您只能減去指向同一個數組內的指針(或數組結尾後的一個位置)。

當然,它很可能適用於大多數編譯器,並且在您的平臺上獲得25,因爲sizeof(int) == 4。如果他們是char *,你會得到100.(可能,或者它可能會崩潰,這是UB的美麗)。

0

即使標準不承諾定義的行爲,結果是正確的。 您的體系結構中需要4個字節的整數。因此,差異給你整數值兩個指針是分開的。 您可以將差異用作數組中的索引或偏移量。 出於同樣的原因

int *p = (int*) 100; 
    p++; 

將導致p = 104。

0

當然它是未定義的。減去兩個任意指針(視爲整數)甚至不能保證是對象大小的倍數。

相關問題