请解释这个查找最大指针的过程有什么问题
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,而有符号整数会再次得到未定义的行为(参见有符号整数溢出)。
希望对你有帮助。
永远不会为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++;
相关文章:
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 复制文件的最佳方式是什么,以便我可以在复制过程中轻松取消复制?
- c++:在函数返回过程中,"catching reference in value"与"catching value in value"有什么区别?
- 在保留类名的同时弃用类模板的正确过程是什么?
- 在提前操作过程中,对象会发生什么
- 将大量数据从C 应用程序传递到SQLServer存储过程的最快方法是什么?
- 在编译过程中,琐碎的(没有效果的)代码什么时候会被删除
- 当托管它崩溃的可执行过程时,全局挂钩会发生什么
- 在Windows上运行cygwin的C ++程序的安装后过程是什么
- C++;编译过程中的警告"enabled by default"是什么意思?
- 在C++11类型推理过程中,控制优先级的规则是什么
- NPM 模块画布需要的在 OSX Mountain Lion 上安装 c++ 库的过程是什么?
- 字符串字符是统一码吗?转换过程中会发生什么
- 在无法访问的目的地上 ICMP 回显请求/回复的正确过程是什么
- 如果WinRT应用程序在文件复制过程中终止,会发生什么
- 不同的基本对象过程使用什么设计模式
- 让c++项目在android中工作的完整过程是什么
- 模板演绎中的部分排序过程是什么?< / h1 >
- 有人能确切地解释一下,如果在堆上分配对象数组的过程中抛出异常,会发生什么吗
- Java的翻译过程是什么