我試圖打印兩個指針之間的距離,但我發現有時代碼不能正常工作。任意指針之間的距離
#include <stdio.h>
#include <math.h>
/**
* Print the distance between 2 pointers
*/
void distance(int * a0, int * a1){
size_t difference = (size_t) a1 - (size_t) a0;
printf("distance between %p & %p: %u\n" ,a0, a1, abs((int) difference));
}
試試這個作品完美!
int main(void){
int x = 100;
int y = 3000;
distance(&x, &y);
return 0;
}
印刷(例如):
distance between 0028ff18 & 0028ff14: 4
但開始使用此代碼
int main(void){
int x = 100;
int p = 1500;
int y = 3000;
distance(&x, &y);
p = p + 2; // remove unused warning
// &p
return 0;
}
印刷(例如)腳麻:
distance between 0028ff18 & 0028ff14: 4
當有因爲o打印8
f分隔這個值的整數!
但是,如果我取消註釋//&p
,它再次工作。
就好像變量p
直到它的內存地址被使用時才存在。
我使用的是Windows 7中(64位)
GCC是優化它拿走。嘗試用'-O0',儘管它可能仍然會留下一些優化。此外,您可以使用['ptrdiff_t'](http://en.cppreference.com/w/c/types/ptrdiff_t)而不是'size_t '投下。但請注意,嚴格來說,只有指向同一陣列中元素的指針可能會從彼此中有意義地減去。 – Kninnug
就像你已經注意到的那樣,編譯器正在優化你的變量p,因爲即使你賦值給它,也不會使用它,只剩下x和y。 –
你最好使用一個數組來進行這種實驗。你不能依賴鏈接器放置一堆可能與彼此沒有任何關係的不同變量。 – Dmitri