嘿伙计们(预先警告这个问题让我觉得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);
所有内容都编译并运行,但执行永远不会进入比较函数。
非常感谢任何帮助
答案 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 == 0
或4
作为数组的大小传递,那么你就会崩溃。 num_items
的地址是传递给函数的错误地址;您希望传递dynarr
中保存的地址值,而不是dynarr
本身存储的地址。
注意:你应该显示dynarr
不起作用,所以我们不必猜测你写的是什么。