【发布时间】:2017-03-09 16:34:12
【问题描述】:
我必须为任何数据类型编写一个抽象的二进制搜索函数,并将比较函数作为参数。我不知道如何处理 void,因为不可能使用指针算术。然后我看到了标准的 qsort 函数并且确实这样做了。问题是当发生从void* 到char* 的转换时会发生什么?为什么会起作用?
void *bin_srch(void *a, size_t n, size_t bs, void *x, int (*cmp)(const void *a, const void *b))
{
size_t f = 0, l = n;
if(!n) return NULL;
while (f < l)
{
size_t m = f/2 + l/2;
char *mid = (char*)a + m*bs;
if (cmp(x, mid) <= 0)
l = m;
else
f = m + 1;
}
char *t = (char*)a + l*bs;
if (!cmp(t, x))
return t;
else
return NULL;
}
【问题讨论】:
-
您不需要将任何内容转换为
char *- 您的函数中的所有指针都应该是void * -
@Someprogrammerdude 好吧,为什么是 UB?
char *可以用来访问任何其他类型,不是吗? -
@ChrisTurner 你函数中的所有指针都应该是
void *如何对void *指针进行指针运算? -
@AndrewHenle 指针大小相同,与类型无关,因此您可以像任何其他指针一样使用它们,即
myvoidptr++ -
@ChrisTurner 我认为你犯了一个错误。您不能增加
void*指针 - 它只是不起作用,而且即使它起作用也不清楚它会做什么 -ptr++将指针增加sizeof(*ptr)字节。这对于void*指针没有意义,因为void本身不是有效类型。
标签: c pointers casting binary-search