2012-11-20 96 views
-1
int main() 
{ 
int *p,*q; 
p=(int *)1000; 
q=(int *)2000; 
printf("%d:%d:%d",q,p,(q-p)); 
} 

輸出指針類型轉換

2000:1000:250 

1.I無法理解p=(int *)1000;線,這是否意味着p被指向1000地址位置?如果我這樣做*p=22該值是否存儲在1000個地址並覆蓋現有值?如果它覆蓋該值,那麼如果另一個程序正在處理1000個地址空間呢?

  1. how q-p=250

編輯:我試過printf("%u:%u:%u",q,p,(q-p));輸出是一樣的

int main() 
{ 
int *p; 
int i=5; 
p=&i; 
printf("%u:%d",p,i); 
return 0; 
} 

輸出

3214158860:5 
  1. 這是否意味着由編譯器所使用的地址是整數?正常整數和地址整數沒有區別?
+0

爲什麼downvote?plz解釋。我認爲我不應該接受任何答案,除非我得到downvotes的解釋 –

回答

4

這是否意味着p指向1000個地址位置?

是的。

如果我這樣做,* P = 22

它調用未定義行爲 - 你的程序很可能會崩潰與段錯誤。

請注意,在現代操作系統中,地址是虛擬的 - 您不能像這樣覆蓋其他進程的地址空間,但可以嘗試在自己的進程地址空間中寫入無效內存位置。

how q-p = 250?

因爲指針運算就像這樣(爲了與數組索引兼容)。兩個指針的差值是它們的值除以sizeof(*ptr)的差值。類似地,將n添加到類型爲T的指針ptr的結果爲數值ptr + n * sizeof(T)

Read this on pointers.

這是否意味着由編譯器所使用的地址是整數?

「編譯器使用」部分甚至沒有必要。地址整數,它只是C中的一個抽象,我們有很好的指針來緩解我們的生活。如果你是在彙編編碼,你只要把它們當作無符號整數。

順便說一句,寫

printf("%u:%d", p, i); 

也是不確定的行爲 - 在%u格式說明預計的unsigned int,而不是一個指針。要打印指針,使用%p

printf("%p:%d", (void *)p, i); 
+0

如果我做p =(int *)1;輸出是1 offcourse但我想了解的是如何編譯器處理這個 –

+0

@BhavikShah好吧,它編譯它,你還期望什麼其他類型的「處理」? – 2012-11-20 07:01:40

+0

我會添加一些問題 –

-1
does this mean that p is pointing to 1000 address location? 

是的。但是這1000個地址可能屬於某個其他進程的地址。在這種情況下,您非法訪問另一個進程的地址空間的內存。這可能會導致分段錯誤。

+0

羽絨選民的解釋高度讚賞。 – Jeyaram

+0

在沒有虛擬內存的嵌入式操作系統之外,屬於另一個進程的地址空間的地址極其不可能。再加上上面的代碼不取消引用指針,所以它不訪問該地址。 – Mat

+1

'如果我做了* p = 22,那麼這個值是否存儲在1000個地址並覆蓋現有的值呢?「OP問道。 @Mat,請清楚地閱讀這個問題。 – Jeyaram

1

是的,*p=22你寫1000點的地址。

q-p是250,因爲INT的大小是4所以這是2000-1000/4 = 250

0
  1. 是,p指向虛擬地址1000如果使用*p = 22;,你很可能得到一個分段故障;通常,整個前1024個字節對於讀取或寫入都是無效的。假設你有虛擬內存,它不會影響另一個程序;每個程序都有自己的虛擬地址空間。

  2. q - p的值是兩個地址之間的sizeof(*p)sizeof(*q)sizeof(int)的單位數。

0

將任意整數轉換爲指針是未定義的行爲。任何事情都可能發生,包括任何事情,分段錯誤或者默默覆蓋其他進程的內存(在現代虛擬內存模型中不太可能)。

但是,我們曾經使用絕對地址這樣回到了DOS實模式下天訪問中斷表和變量BIOS :)

關於q-p == 250,它的指針運算的語義的結果。顯然sizeof int在您的系統中是4。所以當你給int指針加1時,它實際上會增加4,所以它指向下一個字節的下一個int。這種行爲有助於數組訪問。

1

p = (int *) 1000的含義是由實現定義的。但是,是的,在典型的實施中,它將使p指向地址1000

之後做*p = 22確實會嘗試存儲22地址1000。但是,通常情況下,這種嘗試會導致未定義的行爲,因爲您不允許將數據寫入任意內存位置。你必須以某種方式分配內存以便能夠使用它。在你的例子中,你沒有做任何努力來分配地址1000。這意味着您的程序很可能會崩潰,因爲它試圖將數據寫入未正確分配的內存區域。 (另外,通過指針,以多種平臺來訪問數據,這些指針必須指向正確對準位置。)

即使以某種方式成功地書寫成功的22地址1000,但這並不意味着它會以任何方式影響「其他方案」。在一些舊的平臺上,它會(像DOS一樣)。但是現代平臺爲每個正在運行的程序(進程)實現獨立的虛擬內存。這意味着每個正在運行的進程都有其自己的獨立地址1000,並且無法看到其他程序的地址1000

+0

我希望我可以接受多個答案,謝謝 –