我是否正确地认为,为了对指针数组进行排序,将指针视为 int 是可以的,例如
qsort(ptrs, n, sizeof(void*), int_cmp);
我想对 ptr 进行排序以确定是否存在重复项,而不管指针指向的类型是什么,因此 qsort 是执行此操作的先驱。
my int_cmp()
是相当标准的,例如
int int_cmp(const void *a, const void *b)
{
const int *ia = (const int *)a; // casting pointer types
const int *ib = (const int *)b;
/* integer comparison: returns negative if b > a
and positive if a > b */
return *ia - *ib;
}
它似乎在我的单元测试中起作用,但是是否有某种原因将 ptr 视为 int 可能会导致我可能忽略的这种情况出现问题?
不,你根本不对,除非你want按地址对指针进行排序。不过,实际地址很少有任何意义,所以这种可能性很小。
为了检测重复的指针,您应该只比较指针,这是明确定义的。
我可能会使用一个解决方案uintptr_t
:
static int order_pointers(const void *pa, const void *pb)
{
const uintptr_t a = *(void **) pa, b = *(void **) pb;
return a < b ? -1 : a > b;
}
还没有测试过这个,但类似的东西应该有效。
转换为uintptr_t
是必要的,因为您无法有效地比较随机指针。我引用 C99 标准草案,§6.5.8.5:
比较两个指针时,结果取决于指针中的相对位置
所指向对象的地址空间。如果两个指向对象或不完整类型的指针都
指向同一个对象,或者都指向同一数组对象的最后一个元素,
他们比较平等。如果指向的对象是同一个聚合对象的成员,
稍后声明的指向结构成员的指针比较大于指向成员的指针
在结构体的前面声明,并指向具有较大下标的数组元素
值比较大于指向同一数组中具有下标的元素的指针
价值观。指向同一联合对象成员的所有指针比较相等。如果
表达式 P 指向数组对象的元素,表达式 Q 指向
同一数组对象的最后一个元素,指针表达式 Q+1 比较大于
P。在所有其他情况下,行为是未定义的。
我将最后一句加粗,因为这就是这里适用的内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)