请解释这个查找最大指针的过程有什么问题

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

本文关键字:过程 什么 问题 指针 解释 查找      更新时间:2023-10-16

最高的指针不就是不能通过指针算术递增的指针吗?

#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,而有符号整数会再次得到未定义的行为(参见有符号整数溢出)。

希望对你有帮助。

永远不会为false,因此永远不会退出

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++;