qsort()不对结构中的数据进行排序

pat*_*wed 0 c struct qsort

我有一个结构:

typedef struct personalData
{
    char name[20];
    char * remarks;
    int age;
    float weight;
} personalData;
Run Code Online (Sandbox Code Playgroud)

我需要按重量对数据进行排序qsort().这是我的weightSort功能:

void weightSort(personalData * data[], int len)
{
    qsort(data, len, sizeof(struct personalData *), structSortWeight);
}
Run Code Online (Sandbox Code Playgroud)

where len= 10(在使用某些不同的函数之前计算,但可能无关紧要),data[]定义main()如下:

struct personalData * data[10];
Run Code Online (Sandbox Code Playgroud)

最后structSortWeight:

int structSortWeight(const void *a, const void *b)
{
    personalData *p1 = (personalData *)a;
    personalData *p2 = (personalData *)b;

    return (p1->weight - p2->weight);
}
Run Code Online (Sandbox Code Playgroud)

我的程序在开始排序时崩溃了.我想补充一点,当我改变了第三个参数中qsort(),以sizeof(float)它不会崩溃,但p1->weight并p2->weight指向一些垃圾.

调用函数main():

weightSort(data, len);
Run Code Online (Sandbox Code Playgroud)

personalData * data[] 已经分配了一些数据.

Joh*_*ger 7

这个数组声明:

struct personalData * data[10];
Run Code Online (Sandbox Code Playgroud)

不声明适合用作第一个参数的对象

void weightSort(personalData data[], int len)
Run Code Online (Sandbox Code Playgroud)

变量和函数参数具有不同的间接级别.您的实际数据是一个指针 数组struct personalData,而函数参数适用于结构本身的数组.这会产生未定义的行为.可能更具功能相关性,qsort()因此传递给的项目大小不正确:对于声明的数据main(),您希望项目大小不是大小struct personalData,而是指向一个(sizeof(struct personalData *))的指针大小.

此外,您的比较功能是错误的.首先,它必须返回一个int,而不是一个float,但在第二个位置,因为你要排序的元素是指向结构的指针,呈现给比较函数的参数将是指向这些指针的指针.您将它们视为直接指向结构的指针.