相关疑难解决方法(0)

508
推荐指数
8
解决办法
5万
查看次数

是否可以在 C 中(不调用 UB)检查两个对象是否重叠?

当两个指针进行比较时,结果取决于所指向的对象在地址空间中的相对位置。如果指向对象或不完整类型的两个指针都指向同一个对象,或者都指向同一个数组对象的最后一个元素之后的一个,则它们比较相等。如果指向的对象是同一个聚合对象的成员,则指向后面声明的结构体成员的指针比较大于指向结构体中前面声明的成员的指针,指向下标值较大的数组元素的指针比较大于指向同一数组元素的指针具有较低的下标值。指向同一联合对象成员的所有指针比较相等。如果表达式 P 指向数组对象的一个​​元素,并且表达式 Q 指向同一数组对象的最后一个元素,则指针表达式 Q+1 比较结果大于 P。在所有其他情况下,行为未定义。

如果我们有两个引用相同类型数组的指针,并且我们有这些数组的长度,我们是否可以在不调用 UB 的情况下找到这些数组是否不重叠?

备注:我对向我展示在现实生活中(实施等)可以做到的例子不感兴趣。因此,请不要显示代码(除非您可以[标准地]证明 UB 是免费的)。

c language-lawyer

30
推荐指数
3
解决办法
3226
查看次数

如何比较C指针?

最近,我写了一些代码来比较像这样的指针:

if(p1+len < p2)
Run Code Online (Sandbox Code Playgroud)

但是,有些工作人员说我应该这样写:

if(p2-p1 > len)
Run Code Online (Sandbox Code Playgroud)

为了安全起见.这里,p1p2char *指针,len是整数.我对此一无所知.是吗?

EDIT1:当然,p1p2在乞讨时指向同一个内存对象.

EDIT2:就在一分钟之前,我在我的代码中找到了这个问题的bogo(大约3K行),因为len它太大了,p1+len不能存储在4个字节的指针中,所以p1 + len <p2真的.但它不应该事实上,所以我认为我们应该在某些情况下比较像这样的指针:

if(p2 < p1 || (uint32_t)p2-p1 > (uint32_t)len)
Run Code Online (Sandbox Code Playgroud)

c pointers

25
推荐指数
3
解决办法
3万
查看次数

std::less&lt;Pointer&gt; 的严格全序

这个问题来自这个评论

如果有两个向量 a 和 b,则总顺序允许为 &a[0], &b[0], &a[1], &b[1], &a[2], &b[2], ... ,即元素交错。

该命令是否被允许?

我对标准了解不多。如果我只阅读与 直接相关的部分,这似乎是正确的std::less

我发现 Herb Sutter 的 gcpp 库有类似的用法(链接):

    //  Return whether p points into this page's storage and is allocated.
    //
    inline
    bool gpage::contains(gsl::not_null<const byte*> p) const noexcept {
        //  Use std::less<> to compare (possibly unrelated) pointers portably
        auto const cmp = std::less<>{};
        auto const ext = extent();
        return !cmp(p, ext.data()) && cmp(p, ext.data() + ext.size());
    }
Run Code Online (Sandbox Code Playgroud)

c++ comparison pointers language-lawyer

7
推荐指数
1
解决办法
248
查看次数