gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:06:33 25 4
gpt4 key购买 nike

我有一个结构:

typedef struct personalData
{
char name[20];
char * remarks;
int age;
float weight;
} personalData;

我需要使用 qsort() 按权重对数据进行排序。这是我的 weightSort 函数:

void weightSort(personalData * data[], int len)
{
qsort(data, len, sizeof(struct personalData *), structSortWeight);
}

其中 len = 10(在使用一些不同的函数之前计算的,但它可能无关紧要),data[] 是在 main() 中定义的:

struct personalData * data[10];

最后是 structSortWeight:

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

return (p1->weight - p2->weight);
}

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

main()中的调用函数:

weightSort(data, len);

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

最佳答案

这个数组声明:

struct personalData * data[10];

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

void weightSort(personalData data[], int len)

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

此外,您的比较功能是错误的。首先,它必须返回一个int,而不是一个float,但其次,因为你正在排序的元素是指向结构的指针,所以参数呈现给比较函数将是指向此类指针的指针。您将它们视为直接指向结构的指针。

关于c - qsort() 不对结构中的数据进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48066494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com