将 std::sort 与指向整数变量的指针一起使用会产生意外的输出
Using std::sort with pointers to integer variables produces unexpected output
我决定编译并运行这段代码(出于好奇),G++编译器成功编译了该程序。我期待看到编译错误或运行时错误,或者至少 a 和 b 的值交换(作为 5> 1),因为std::sort()
函数是用两个指向整数的指针调用的。 (请注意,我知道这不是一个好的做法,我基本上只是在玩指针)
#include <iostream>
#include <algorithm>
int main() {
int a{5};
int b{4};
int c{1};
int* aptr = &a;
int* bptr = &b;
std::sort(aptr, bptr);
std::cout << a << ' ' << b << ' ' << c << 'n';
return 0;
}
但是,在执行程序时,我得到的输出是这样的:
5 4 1
我的问题是,C++如何允许对std::sort()
函数进行这种调用?它最终如何没有实际对 a 和 b 的内存地址之间的所有内容进行排序(甚至可能包括内存中的垃圾值)?
我的意思是,如果我们尝试使用这样的 C 样式数组(std::sort(arr, arr+n)
),它将成功地对 C 样式数组进行排序,因为arr
和arr+n
基本上只是指针,其中n
是数组的大小,arr
是指向第一个元素的指针。
(如果这个问题听起来很愚蠢,我很抱歉。我还在学习C++。
您的程序格式不正确,无需诊断。 您将不构成范围的指针传递给 std 算法。
程序的任何行为都符合C++标准。
编译器围绕以下事实进行优化:指向不相关对象的指针是无与伦比的,并且它们的差异是未定义的。 这里的排序会绊倒如此多的 UB,优化器可以疯狂地消除分支(因为任何带有 UB 的分支都可以被消除并替换为替代分支(无论备用分支是 UB 的合法结果是什么代码))。
因此,良好的C++编码风格侧重于避免使用UB和IL-NDR代码。
C++接受您的代码,因为它在语法上是正确的。但它不起作用,因为 sort(it1, it2) 期望它 1 一个是数组的某个起始位置,而 it2 是同一数组的结束位置。您为 sort 函数提供了两个不同的数组,它们可能会产生以下两种情况中的任何一种:
positionof(it1) <positionof(it2):>假设在计算机的内存数组中,A和B存储在这样的5(a),-1,-2,10,4(b)中。 然后排序函数将从 5 到 4 排序,结果为:-2(a),-1,4,5,10(b)。
positionof(it1)> positionof(it2)(机器的情况):sort 函数不会像left_position> right_position那样做任何事情。
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 字符串比较中的意外输出
- 每次在 c++ 中输出不同(意外行为)
- 来自 decltype 的意外输出类型
- 字符数组到十六进制字符串的转换 - 意外输出
- 使用 boost::regex 从目录中获取带有一些正则表达式的文件名称时出现意外输出
- 使用后序遍历递归的深度优先搜索会产生意外输出
- C++的意外输出
- 标准输出C++意外行为
- 贝金纳C++练习解决方案的意外输出
- 无效* 转换获得意外输出
- 以下程序的意外输出
- 意外输出:矢量矢量(功率集)
- 基本 int 数组提供意外输出
- 线程的意外输出
- 减法中的意外输出
- 带有左移操作员C 的意外输出
- C strncpy意外输出
- 意外输出..函数绑定在虚拟表中的发生方式
- 星号的意外输出