用签名结果减去2个指针,适合输入红黑树“比较器”

时间:2012-10-05 22:14:20

标签: c pointers

在C中做了以下工作?

struct fdBase *left, *right;
int result = (int)(left - right);

result可能是否定的。如果这不起作用,我该如何写呢?

我的目标是为我的红黑树排序功能提供一些东西,一个所谓的指针“比较器”。 我没做数组工作,我需要指针之间的实际差异,以字节为单位。

3 个答案:

答案 0 :(得分:7)

根据定义,在C中减去两个指针的结果具有符号结果。结果为ptrdiff_t类型,这是一个带符号的整数类型。

这里重要的细节是你不能只减去两个任意指针。为了定义结果,指针必须指向同一个数组的元素(或虚构的“一个接一个结束”元素)。

减法的结果用元素表示,而不是以字节表示,即它与C中的其余指针算法一致。如果A - B A的结果可以而且将是负数指向索引大于B的元素。

如果你需要指针指向的原始地址之间的字节差异,那么或多或少正式有效的方法将是以下

intptr_t difference = (intptr_t) left - (intptr_t) right;

这样你就不会减去指针(因为它没有为任意指针定义),而是减去它们的整数表示。 (intptr_t) some_pointer转换的结果是实现定义的,但通常是存储在指针中的物理内存地址。遗憾的是,这种方法有一些问题:对于1是高阶位的指针,它可能会产生错误的结果。转换为intptr_t时,此类指针通常会产生负值。

答案 1 :(得分:0)

尝试

struct fdBase *left, *right;
void *result = (void *)left - (void *)right;

另外两个想法:

1 - 假设你正在使用的功能要求你的比较器应该返回一个负数if(left< right),0 if if(left = right)和一个正数if(left> right):

    struct fdBase *left, *right;
    if (left < right)
        return -1;
    else if (left == right)
        return 0;
    else
        return 1;

或更紧凑的版本:

    if (left < right) ? -1 : (if (left == right) ? 0 : 1)

2 - 将减法的差值乘以sizeof(fdBase)

    struct fdBase *left, *right;
    int result = (int)(left - right) * sizeof(fdBase)

答案 2 :(得分:0)

根据目前为止的答案,我认为我想要的是:

struct fdBase *left, *right;
ptrdiff_t result = (char *)left - (char *)right;