【问题标题】:qsort doesnt change my array orderqsort 不会改变我的数组顺序
【发布时间】:2015-09-03 16:29:03
【问题描述】:

我有一个结构数组(员工):

typedef struct Employee{
    char name[MAX_SIZE];
    int salary;
    int experience;
} employee_t;

我想按薪水重新排序我的数组,我创建了一个比较器:

int compareEmployeesBySalary(const void* a, const void* b){
        employee_t* one = (employee_t*)a;
        employee_t* two = (employee_t*)b;

        if (one->salary == two->salary)
            return 0;
        else if (one->salary > two->salary)
            return 1;
        else
            return -1;
    }


void main()
{
    int i;

    employee_t** employeeArray = (employee_t**)malloc(sizeof(employee_t*)*5);

    for(i=0 ; i < 2 ; i++)
    {
        employeeArray[i] = (employee_t*)malloc(sizeof(employee_t));
        readEmployee( employeeArray[i] ); //input for 5 employee's
    }

    puts("");
    puts("beforesort\n");
    for(i=0; i <2 ; i++)
    {
        printEmployee(employeeArray[i]);
    }
    puts("--------------------------------------------------------");
    puts("after salary sort\n");

    qsort(&employeeArray, 2, sizeof(employee_t), compareEmployeesBySalary);
    for(i=0; i < 2 ; i++)
        printEmployee( employeeArray[i] );
}

当我正常运行它时,它只是按我插入员工的顺序打印原始数组,但是当我调试它时,它通过我的比较函数打印, 这是为什么呢?

谢谢!!!

【问题讨论】:

  • 您可能运行的是过时的发布版本二进制文件,而调试版本每次都会重新构建。
  • qsort(&amp;employeeArray… 看起来不对。那不应该是qsort(employeeArray…吗?
  • @Eugene Sh 我解决了吗?
  • 但是当我调试它时,它会通过我的比较功能打印出来——你是什么意思?是不是,如果你放断点,代码就可以工作?
  • 是否也要重新构建发布版本?

标签: c function structure


【解决方案1】:

你需要改变这个:

qsort(&employeeArray, 2, sizeof(employee_t), compareEmployeesBySalary);

收件人:

qsort(employeeArray, 2, sizeof(employee_t *), compareEmployeesBySalary);

第一个参数必须是employeeArray,因为qsort() 函数接收指向数组开头的指针,而不是指向数组开头的指针。另外,你有一个指针数组,而不是employee_t 的数组,所以第三个参数必须是sizeof(employee_t *)

最后,将比较函数更改为:

int compareEmployeesBySalary(const void* a, const void* b){
        employee_t* one = *(employee_t **)a;
        employee_t* two = *(employee_t **)b;

        if (one->salary == two->salary)
            return 0;
        else if (one->salary > two->salary)
            return 1;
        else
            return -1;
}

因为你拥有的是一个指针数组,所以ab 将是employee_t ** 类型。

【讨论】:

  • @EugeneSh。这很奇怪。代码原样调用 UB,所以我将其归咎于此 - 尽管我发现很难相信它在调试器中工作,但他可能只是幸运。 OTOH,当我用我的修改进行测试时,它就像一个魅力。
  • 是的,听起来不太可能
【解决方案2】:

我看到的一件事是您将sizeof(employee_t) 传递给qsort 的大小参数,而您的数组只存储指向employee_t 的指针。我建议您尝试将qsort 中的sizeof(employee_t) 替换为sizeof(employee_t*)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多