C 动态分配结构指针数组,指向它们并对它们进行qsort排序

C 动态分配结构指针数组,指向它们并对它们进行qsort排序,c,pointers,struct,C,Pointers,Struct,我一整天都在谷歌上搜索,试图做到这一点,但没有成功。还有其他类似的问题,但我似乎无法让它工作 代码如下: void sort_structs_example(Stock **head, int count) { Stock **toSort = NULL; int i; memLoc(&toSort, sizeof(toSort)*count); for (i = 0; count > 0 && i < count &am

我一整天都在谷歌上搜索,试图做到这一点,但没有成功。还有其他类似的问题,但我似乎无法让它工作

代码如下:

void sort_structs_example(Stock **head, int count)
{
    Stock **toSort = NULL;

    int i;

    memLoc(&toSort, sizeof(toSort)*count);

    for (i = 0; count > 0 && i < count && (head != NULL); i++)
    {
        if (i == 0) toSort[0] = *head;
        else
        {
            toSort[i] = toSort[i - 1]->next;
        }
    }

    qsort(toSort, count, sizeof(Stock), struct_cmp_by_product);

    for (i = 0; count > 0 && i < count && (head != NULL); i++)
    {
        printColor(-1, i, toSort[i]->name, 'G', 'B');
    }

    system("pause");
    free(toSort);
}

int struct_cmp_by_product(const void *Ap, const void *Bp)
{
    Stock A = *(Stock *)Ap;
    Stock B = *(Stock *)Bp;
    return strcmp((&A)->name, (&B)->name);
}

所以我认为我没有正确地使用memLoc,qsort条件中的某些东西被弄乱了,但是我在所有的指针中都纠结了。请帮忙?谢谢。

我不能提供一个解决方案,但我可以看出您的指针有问题。在
struct\u cmp\u by\u product()
中,您已将结构值复制到局部变量,然后将其用作指针

return strcmp((&A)->name, (&B)->name);
直接使用本地结构会更好

return strcmp(A.name, B.name);
更好的方法是这样,它可以重铸指针类型(而不是指针指向的类型)


这样做更好的原因是
Stock
可能是一个非常大的结构,不需要制作本地副本。

使用所有警告和调试信息编译(
gcc-Wall-Wextra-g
)。然后使用调试器(
gdb
)将其分解为单个问题。在这一点上,使用调试器将有所帮助,因为在编写时,您提供的代码段将无法通过编译。您将收到警告和错误。
return strcmp(A.name, B.name);
int struct_cmp_by_product(const void *Ap, const void *Bp)
{
    return strcmp( ((Stock *)Ap)->name, ((Stock *)Bp)->name );
}