[英]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.