Qsort 没有按照我期望的方式使用 void 指针工作

Jak*_*way 2 c pointers void-pointers

所以我尝试使用 qsort 对 C 中的 void 指针的通用数组列表进行排序。

当我实际使用数组列表时,我正在存储Queue指针。

我很确定我打电话是qsort正确的

qsort(al->list, al->size, sizeof(void *), al->cf );
Run Code Online (Sandbox Code Playgroud)

在我的比较器函数中,我想这样做

int compareQCtgry(const void * queueA, const void * queueB)
{
    Queue * q1 = (Queue *) queueA;
    Queue * q2 = (Queue *) queueB;
    return strcmp(q1->category, q2->category);
}
Run Code Online (Sandbox Code Playgroud)

但是,我遇到了段错误。

但是当我将其更改为

int compareQCtgry(const void * queueA, const void * queueB)
{
    Queue * q1 = *(Queue **) queueA;
    Queue * q2 = *(Queue **) queueB;
    return strcmp(q1->category, q2->category);
}
Run Code Online (Sandbox Code Playgroud)

它有效,但对我来说毫无意义。为什么将 void 指针强制转换为 a Queue **,然后取消引用它,而您似乎应该只能使用 a 来强制转换它Queue *

Jef*_*tin 6

qsort在排序时将指向列表元素的指针传递给比较例程。由于您的列表已经是一个指针列表Queue,因此指向这些指针的指针是指向指针的指针Queue