簡體   English   中英

請解釋此過程中發現最大指針的不正確之處

[英]Please explain what is incorrect about this procedure to find the largest pointer

最高的指針會不會是無法通過指針算法遞增的指針?

#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

如前所述,您有一個無限循環,因為條件永遠不會為false

話雖這么說,您正在做的是未定義的行為,非法的C ++。 指針算術僅在指針指向相同數組(並且單個對象被視為一個元素的數組)並且在其末尾之后才合法。 即使您修復了循環,也無法期待程序的合理結果。

我懷疑std::numeric_limits < uintptr_t >::max()的值是指針的理論最大值(轉換為整數),但是它可能不適用於您的程序。 需要考慮諸如虛擬地址空間分段內存模型之類的問題 無論如何,指針的確切值( nullptr除外)不是您應該關注的。 您可以通過獲取現有對象的地址或調用分配函數來獲得指針,僅此而已。

注意:我認為您有一個誤解,嘗試將整數類型增加到其最大值以上將無濟於事。 這是不正確的-無符號整數將回繞為0,使用有符號整數,您將再次獲得未定義的行為(請參見有符號整數溢出 )。

希望能有所幫助。

這將永遠是錯誤的,因此永遠不會退出

while ((px+1) != px)

看一下這個程序:

#include <iostream>

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

其輸出是:

Value: 0xffffffffffffffff Value: 0x3

如您所見,當遞增最大指針時,它將重置其值並再次開始

您可能想要查找在回繞之前出現的最大指針值,即:

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM