0

假设我需要一个函数来检查两个任意缓冲区是否交错*。想到的一个直截了当的想法是:

bool isInterleaved(uint* buf1, // pointer to first buffer
                   uint* buf2, // pointer to second buffer
                   uint len1,  // length of first buffer
                   uint len2,  // length of second buffer
                   uint stride1, // stride length of first buffer
                   uint stride2) // stride length of second buffer
{
    ... // first some sanity checks like (NULL != buf), (0U < len),...

    bool retval = false;
    if ((len1 == len2) && (2U == stride1) && (2U == stride2))
    {
        if ((&buf1[1] == &buf2[0])  ||
            (&buf2[1] == &buf1[0]))
        {
            retval = true;
        }
    }
    return retval;
}

在纸面上,它看起来足够好,快速测试是积极的。但是,在 C 和 C++ 中,仅当指针指向同一对象的成员或同一数组的元素时,才严格定义指向对象的指针的比较。

我的示例 - 特别是后面的那一行(&buf1[1] == &buf2[0])- 是否构成未定义的行为?如果是,我如何在不依赖未定义行为的情况下实现这样的检查?


*请参阅编辑历史以获取交错数据的示例或查看有关交错的维基百科文章。正如评论所暗示的,这不是“一个错误的词”。

4

1 回答 1

2

我的示例是否构成未定义的行为?

呈现的代码没有未定义的行为。指针可以与 比较==。即使它们指向不同的对象。

您所指的规则适用于< > <=and>=运算符。在“不同的对象”上使用这些运算符是未定义的行为。在C99 6.5.8p5中可以找到关于指针的关系运算符的标准语义草案。

于 2020-01-22T14:55:40.917 回答