在C中做了以下工作?
struct fdBase *left, *right;
int result = (int)(left - right);
result
可能是否定的。如果这不起作用,我该如何写呢?
我的目标是为我的红黑树排序功能提供一些东西,一个所谓的指针“比较器”。 我没做数组工作,我需要指针之间的实际差异,以字节为单位。
答案 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;