当两个指针进行比较时,结果取决于所指向的对象在地址空间中的相对位置。如果指向对象或不完整类型的两个指针都指向同一个对象,或者都指向同一个数组对象的最后一个元素之后的一个,则它们比较相等。如果指向的对象是同一个聚合对象的成员,则指向后面声明的结构体成员的指针比较大于指向结构体中前面声明的成员的指针,指向下标值较大的数组元素的指针比较大于指向同一数组元素的指针具有较低的下标值。指向同一联合对象成员的所有指针比较相等。如果表达式 P 指向数组对象的一个元素,并且表达式 Q 指向同一数组对象的最后一个元素,则指针表达式 Q+1 比较结果大于 P。在所有其他情况下,行为未定义。
如果我们有两个引用相同类型数组的指针,并且我们有这些数组的长度,我们是否可以在不调用 UB 的情况下找到这些数组是否不重叠?
备注:我对向我展示在现实生活中(实施等)可以做到的例子不感兴趣。因此,请不要显示代码(除非您可以[标准地]证明 UB 是免费的)。
我有一段记忆,我正在"守卫",定义为
typedef unsigned char byte;
byte * guardArea;
size_t guardSize;
byte * guardArea = getGuardArea();
size_t guardSize = getGuardSize();
Run Code Online (Sandbox Code Playgroud)
为此目的可接受的实现是:
size_t glGuardSize = 1024; /* protect an area of 1kb */
byte * getGuardArea()
{
return malloc( glGuardSize );
}
size_t getGuardSize()
{
return glGuardSize;
}
Run Code Online (Sandbox Code Playgroud)
以下代码段可以为任何指针(来自不同的malloc,来自堆栈等)返回true吗?
if ( ptr >= guardArea && ptr < (guardArea + guardSize)) {
return true;
}
Run Code Online (Sandbox Code Playgroud)
该标准规定:
区域内的值将返回true.(当ptr是成员时,所有行为都正确.)
指针将是不同的(a == b只有它们是相同的).
所以我无法理解结果对于来自不同对象的任何指针的结果是否正确(因为它会破坏区域内其中一个指针的不同规则).
编辑:
检测指针是否在区域内的能力非常重要,在某些时候编写代码
if ( isInMyAreaOfInterest( unknownPointer ) ) { …Run Code Online (Sandbox Code Playgroud) 我正在使用一些代码,通过将其地址与描述数据std::vector范围的地址进行比较,检查是否在恒定时间内包含给定元素。vector然而我怀疑,虽然它有效,但它依赖于未定义的行为。如果该元素不包含在 中,vector则不允许进行指针比较。
bool contains(const std::vector<T>& v, const T& a) {
return (v.data() <= &a) && (&a < v.data() + v.size());
}
Run Code Online (Sandbox Code Playgroud)
我相信这是未定义的行为吗?如果是这样,有没有办法在不大幅改变代码时间复杂度的情况下做同样的事情?