2013-12-09 91 views
4

如何比較固定大小的char數組中的兩個內存地址?可以說我有兩個指針,每個指向數組在不同的存儲位置:比較內存地址

char *ptr1; //points to a memory address in the array; 
char *ptr2; //points to another memory address in the array; 

如果我這樣做printf("%p\n%p\n", ptr1, ptr2);然後將打印內存地址爲十六進制。

output: 
0x601240 
0x601274 

我如何將存儲到這些變量,它們是可比的,這樣我可以告訴它的內存地址是第一位在數組中。

另一個問題: 如果我做的%d打印內存地址,我收到%P代替:

output: 
6296128 
6296180 

是這些有效的內存地址,以及(我的意思是這樣的安全使用)?

回答

11

十六進制值只是指針中地址的表示。爲了兩個指針比較(即指向同一個數組或一個過去的數組末尾的元素),你可以使用如下代碼

if (ptr1 < ptr2) 

至於格式說明%d不是指針(儘管在一些實現,它打印正確的值,你不應該使用它),使用%pvoid *指針:

printf("%p\n%p\n", (void *)ptr1, (void *)ptr2); 
+0

如果我知道內存地址停在0x700000(爲了爭辯),我想檢查指針是否指向允許的範圍之外? 'if(ptr1> 0x700000)返回-1;'有效? – mfloris

3

0x601240是十六進制表示,並6296128十進制表示,相同數量的。同樣,0x601274等於62961800x表示接下來是十六進制格式。

在您的C/C++代碼,的ptr1ptr2的值可以與<>比較,以確定哪一個至上在數組中。 (這可以完成而不用擔心它們可以用printf表示的各種方式。)

+0

雖然使用'%d'碰巧在本例中顯示地址的十進制值,但是使用'%d'格式化指針時的行爲不是由C標準定義的,並且通常不安全它。 –

2

這兩個輸出是相同的,並且具有相同的值。第一個是六進制,第二個是十進制。如果你願意的話,你可以比較這兩個指針和任何其他的指針,你也可以對它們進行一些指針運算(減去它們等等)。 但是,如果你的程序應該是便攜式的,這可能是非常微妙的。例如,檢查堆棧增長或減少,這可能會改變你想要做的比較...

+0

只要這些指針在同一個數組中,沒有什麼會改變這種比較。 – glglgl

+0

是的,我錯過了他提到它指向同一陣列上的對象的部分。儘管如此,我認爲提及這一點很重要,因爲在更一般的情況下,您需要考慮這一點。 – yosim