在C中做了以下工作?
struct fdBase *left, *right;
int result = (int)(left - right);
Run Code Online (Sandbox Code Playgroud)
result
可能是消极的.如果这不起作用,我该怎么写呢?
我的目标是为我的红黑树排序函数提供一些东西,一个所谓的指针"比较器".我不做数组工作,我需要指针之间的实际差异,以字节为单位.
根据定义,在C中减去两个指针的结果具有符号结果.结果有ptrdiff_t
类型,它是带符号的整数类型.
这里重要的细节是你不能只减去两个任意指针.为了定义结果,指针必须指向同一数组的元素(或虚构的"一个接一个结束"元素).
减法的结果中的元素表示,而不是在字节,即,它与指针算法的其余部分一致地工作在C的结果A - B
可以和将是负的,如果A
指向与大于索引的元素B
.
如果你需要指针指向的原始地址之间的字节差异,那么或多或少正式有效的方法将是以下
intptr_t difference = (intptr_t) left - (intptr_t) right;
Run Code Online (Sandbox Code Playgroud)
这样你就不会减去指针(因为它没有为任意指针定义),而是减去它们的整数表示.(intptr_t) some_pointer
转换的结果是实现定义的,但通常是存储在指针中的物理内存地址.遗憾的是,这种方法有一些问题:对于具有1
高阶位的指针,它可能会产生错误的结果.转换为时,这些指针通常会产生负值intptr_t
.