我必須爲具有比較函數作爲參數的任何數據類型編寫抽象二進制搜索函數。我不知道如何處理void,因爲使用指針運算是不可能的。然後我看到了標準的qsort函數,並且做到了這一點。問題是發生從void*
到char*
轉換時發生了什麼?它爲什麼有效?Casting void * to char * in C
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 *'指針做指針運算? –