考慮下面的代碼:爲什麼這兩個指針減法給出不同的結果?
char* p = new char[2];
long* pi = (long*) p;
assert(p == pi); // OK
char* p1 = &p[1];
long* pi1 = (long*) p1;
assert(p1 == pi1); // OK
int d = p1 - p;
int d1 = pi1 - pi;
assert(d == d1); // No :(
在此之後運行,我得到d == 1
和d1 == 0
,雖然p1 == pi1
和p == pi
(我查了一下這個在調試器)。這是不確定的行爲?
如果你看看反彙編,'pi1-pi'產生一個減法,然後右移2位。 (在MSVC上)這種右移很明顯是由'sizeof(long)'劃分的,當然這隻會被截斷爲0,只有1的差異。不管這個行爲是否定義,我都不知道。 – Mysticial 2012-02-07 22:57:40