2014-03-25 16 views
0

最高指針是不是通過指針算術不能增加的指針嗎?請解釋什麼是不正確的關於這個程序找到最大的指針

#include <iostream> 

int main() 
{ 
    // Find the largest pointer 
    int x = 0; 
    int* px = &x; 
    while ((px+1) != px) 
     ++px; 
    std::cout << "The largest pointer is: " << px; 

    return 0; 
} 

產生

Timeout 
+4

你究竟在做什麼,'Timeout'從哪裏來? –

+2

你的意思是什麼「最大的指針」?地址最高的那個?它指向什麼? – Cameron

+0

我認爲你搞砸了運營商的意義順序的問題。 –

回答

3

這不會是假的,因此永遠不會退出

while ((px+1) != px) 
+0

當我試着寫答案時,當我的貓在我的筆記本上跳躍時,我討厭它。嘆。 :-) – mvw

1

看看這個程序:

#include <iostream> 

int main() 
{ 
    int *px = (int *) (~0); 
    std::cout << "Value: " << px; 
    ++px; 
    std::cout << " Value: " << px << std::endl; 
} 

的輸出是:

Value: 0xffffffffffffffff Value: 0x3 

正如你所看到的,當你增加一個指針是在其最大的,其值的reseted並再次開始

+1

...但你不能依賴於帶有符號的整數(這是未定義的行爲)。 – Cameron

+0

@Cameron:它也沒有爲指針定義。如果p被轉換爲uintptr_t,並且那個被增加了,那麼它就會有一種奇怪的感覺。但那樣...不行。 – datenwolf

+0

@datenwolf:糟糕,閱讀代碼太快了。我正是這個意思 :-) – Cameron

7

前面已經提到的,你有一個無限循環,因爲條件永遠無法false

這就是說,你在做什麼是未定義的行爲,非法的C++。指針算術只有在指向相同數組的指針(並且單個對象被視爲一個元素的數組)時才合法,並且在其末尾。即使你修復了循環,你也不能指望你的程序有合理的結果。

我懷疑std::numeric_limits<uintptr_t>::max()值是指針的理論最大值(轉換爲整數),但它可能不是avaliable你的程序。有些東西,如virtual address spacesegmented memory model要考慮。無論如何,指針的確切值(nullptr除外)並不是你應該關心的。通過獲取現有對象的地址或通過調用分配函數來獲得指針,就是這樣。

N.B.我認爲你有一個錯誤的想法,試圖增加一個整數類型超過其最大值將只會無所事事。這是不正確的 - 無符號整數將繞回到0和有符號整數再次得到未定義的行爲(請參閱signed integer overflow)。

希望有所幫助。

0

你可能想尋找一個前回繞發生最大的指針值,即:

while (px+1 > px) 
    px++; 

...這是行不通的,當然,如果沒有適當的強制轉換:

while ((unsigned long long)(px + 1) > (unsigned long long)px) 
    px++; 
相關問題