4

可能重复:
检查指针是否指向数组

如果我有一个数组和一个大小,并且我想检查给定的指针是否指向数组内的元素,那么在标准 C 或 C++ 中是否有任何方法可以在不调用 UB 的情况下这样做?

这行得通吗?

bool is_inside(someType * array, int size, someType * other_pointer){
    for (int i = 0; i < size; i++)
        if (array + i == other_pointer)
            return true;
    return false;
}

==编辑:据我了解,除了和!=对于没有 UB 的不指向同一个数组的指针之外,您不能使用比较(尽管实际上它按预期工作)。我错了吗?

4

4 回答 4

3

这取决于你所说的UB是什么意思。

具体来说,对于指针比较,C++ 标准的第 5.9 节“关系运算符”说:

如果相同类型的两个指针 p 和 q 指向不同的对象,它们不是同一对象的成员或不同的函数,或者如果其中只有一个为空,则、p<q和的结果未指定。p>qp<=qp>=q

请注意,行为是未指定的(意味着比较的结果可能是truefalse- 换句话说,结果不会告诉您任何有用的东西 - 但实现不需要指定哪个)而不是未定义(意味着编译器或生成的程序可以做任何事情)。

然而,到目前为止,我只看到一个系列的实现没有像基里尔这样的代码做预期的事情:

bool inside = (other_pointer >= array) && (other_pointer < array+size);

这些实现是用于构建 MS-DOS 实模式程序的编译器,其中地址具有段落和偏移部分。地址 FF00:0010 和 FF01:0000 指向相同的内存位置,但如果我没记错的话,编译器不能保证以预期的方式运行,除非为某些内存模型(当然是HUGE模型,但可能还有其他)进行编译。

但是,如果要么pq不指向现有对象(例如因为指针被释放),那么无论你做什么,行为都将是未定义的。所以你不能用这种方法来判断一个指针是否仍然有效。

于 2012-06-22T22:35:38.380 回答
2

Arrays are guaranteed to be contiguous in memory, so just check that the pointer is within the bounds of the address of the first element and the last.

于 2012-06-22T22:19:47.343 回答
0

Your solution will work but is not optimal as it contains an unnecessary loop.

What you should do, is to take a pointer to the array, the array size in bytes, and check if the pointed address falls within the address space occupied by that array.

于 2012-06-22T22:19:56.387 回答
0

You can simply write:

bool inside = (other_pointer >= array) && (other_pointer < array+size);

This is legal check.

于 2012-06-22T22:20:51.600 回答