gpt4 book ai didi

c - 如何检查指针是否指向数组中的元素?

转载 作者:太空狗 更新时间:2023-10-29 15:21:16 24 4
gpt4 key购买 nike

下面的函数打算检查指针b是否指向数组a[0],...,a[len-1]

bool between(int *a, int len, int *b)
{
return (a <= b) && (b < a + len);
}

来自阅读https://en.cppreference.com/w/c/language/operator_comparison该函数调用未定义的行为。如果是这样,这样做的正确方法是什么?为什么标准不允许这样做?

最佳答案

使用比较运算符 < 比较两个不相关的指针(即不指向同一数组对象或结构成员的指针) , <= , > , 和 >=确实调用链接页面以及 C standard 的第 6.5.8 节中描述的未定义行为.

至于为什么不允许这样做,并非所有实现都具有平面内存模型,并且不相关的对象不需要驻留在执行比较有意义的内存区域中。

所以你的函数会在 b 的情况下返回 true指向 a 的成员, 当它指向 a 的最后一个成员时为 false ,否则会调用未定义的行为。

但是允许使用 == 比较不相关的指针或 != .因此,您可以通过遍历数组并使用相等运算符将目标指针与每个元素进行比较来规避比较运算符的限制:

bool between(int *a, int len, int *b)
{
int i;
for (i=0; i<len; i++) {
if (a+i == b) {
return true;
}
}
return false;
}

虽然这不像远程检查那样有效,但它是唯一符合要求的方法。

当然,最好以不需要这种比较的方式构建程序。允许指向数组内部的指针落在数组外部的程序已经在调用未定义的行为,因此修复该问题将消除对此类函数的需求。

但是请注意,它允许将指向一个元素的指针递增到数组末尾之后并对该指针执行比较(尽管它不能被取消引用)。

关于c - 如何检查指针是否指向数组中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51935285/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com