qsort在c中动态创建数组

时间:2012-09-28 04:52:46

标签: c struct qsort

嘿伙计们(预先警告这个问题让我觉得n00b所以我可能是),

我能够动态创建一个数组,并且我能够有效地将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);

所有内容都编译并运行,但执行永远不会进入比较函数。

非常感谢任何帮助

2 个答案:

答案 0 :(得分:5)

对于常量大小的数组,

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

答案 1 :(得分:2)

qsort的调用只能偶然发挥作用:

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

数组的地址具有相同的值,但与数组的第0个元素的地址不同。演员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);

然后sizeof(dynarr)是指针的大小(比如说64位程序中的8个字节),而sizeof(dynarr[0])是16个字节,所以你告诉的大小(元素个数){{ 1}} sort为0(因为qsort()),因此永远不会调用比较器。如果您的程序编译为32位程序,则指针的大小为4个字节,结构的大小为8个,因此结果仍为0.

请注意,如果你将8 / 16 == 04作为数组的大小传递,那么你就会崩溃。 num_items的地址是传递给函数的错误地址;您希望传递dynarr中保存的地址值,而不是dynarr本身存储的地址。

注意:你应该显示dynarr不起作用,所以我们不必猜测你写的是什么。