2

嘿伙计们(请注意,这个问题让我感觉很糟糕,所以我可能是),

我能够动态创建一个数组,并且能够有效地将 qsort 用于静态创建的数组,但是在动态创建的数组上使用 qsort 时遇到问题。我想我在使用指针时遇到了麻烦。

struct my_struct {
    FILE *fp;
    int i;
};

所以数组包含上述结构,我想按 int 值对其进行排序。

静态地,我可以做这样的事情:

struct my_struct array[4];

并排序:

qsort((void *) &array, sizeof(array) / sizeof(struct my_struct), sizeof(struct my_struct), *compare);

--

如果我这样创建数组:

struct my_struct* = malloc(sizeof(struct process) * 4);

一切都编译并运行,但是执行永远不会进入比较函数。

任何帮助将不胜感激

4

2 回答 2

5

sizeof(array) 是 (sizeof(struct my_struct) * array_size) 用于常量数组,但它只是动态数组的指针大小。您必须自己计算实际大小(传递给 malloc 的大小)并将其放入 qsort 调用中。

于 2012-09-28T04:56:14.803 回答
2

您调用qsortonly 是偶然的:

qsort((void *) &array, sizeof(array) / sizeof(struct my_struct), sizeof(struct my_struct), *compare);

数组的地址与数组的第零个元素的地址具有相同的值但类型不同。演员表void *也是多余的;并且比较器函数的解引用也是一种惯例。通常会这样写:

qsort(array, sizeof(array) / sizeof(array[0]), sizeof(struct my_struct), compare);

或者:

qsort(array, sizeof(array) / sizeof(array[0]), sizeof(array[0]), compare);

如果你有一个动态分配的结构:

size_t num_items = 4;
struct my_struct *dynarr = malloc(sizeof(struct my_struct) * num_items);

或者:

struct my_struct *dynarr = malloc(sizeof(*dynarr) * num_items);

那么您将在对 的调用中以不同的方式指定元素的数量qsort,但其余部分基本不变:

qsort(dynarr, num_items, sizeof(*dynarr), compare);

特别注意&前面没有dynarr,它是一个简单的指针变量,因为它的名称可能具有误导性。


为什么你的代码出错了

一个猜测,但一个合理的猜测。 如果你写:

qsort(&dynarr, sizeof(dynarr) / sizeof(dynarr[0]), sizeof(dynarr[0]), compare);

thensizeof(dynarr)是指针的大小(例如 64 位程序中的 8 个字节),并且sizeof(dynarr[0])是 16 个字节,因此您告诉qsort()排序的大小(元素数)为 0(因为8 / 16 == 0),因此永远不会调用比较器. 如果您的程序编译为 32 位程序,则指针大小为 4 字节,结构大小为 8,因此结果仍然为 0。

请注意,如果您改为传递4num_items作为数组的大小,那么您会崩溃。的地址dynarr是传递给函数的错误地址;您想传递保存在 中的地址值,而不是存储自身dynarr的地址。dynarr

注意:你应该证明qsort()那行不通,这样我们就不必猜测你写了什么。

于 2012-09-28T05:04:40.300 回答