@ Джейсон и @ Тим оба дали правильные ответы. Вот правильная, рабочая программа, которая демонстрирует свои ответы.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct message {
int i;
char *p;
} message;
int textCompare(const void *a, const void *b) {
const message *ma = a;
const message *mb = b;
return strcmp(ma->p, mb->p);
}
int main()
{
int i;
message* mList = malloc(10 * sizeof(message));
mList[0].i = 0; mList[0].p = "zero";
mList[1].i = 1; mList[1].p = "one";
mList[2].i = 2; mList[2].p = "two";
qsort(mList, 3, sizeof(message), textCompare);
for(i = 0; i < 3; i++) {
printf("%d %s\n", mList[i].i, mList[i].p);
}
return 0;
}
Обратите внимание на схему malloc
вызова. Чтобы выделить массив типа T
:
T* var = malloc(array_size * sizeof(T));
Посмотрите, как в объявлении есть только один *
, а оператор sizeof () получает на одну звездочку меньше, чем этот. Некоторые люди предпочитают эту форму:
T* var = malloc(array_size * sizeof *var);
Таким образом, вы должны указать тип только один раз. Это особенно полезно для сложных типов.
Также обратите внимание, что результат malloc
.
отсутствует.
Также обратите внимание, как тип первого аргумента для qsort () соответствует типу преобразованных параметров в функции сравнения. В данном конкретном случае каждый из них message*
.
Возможно, этот вызов qsort проще для понимания и поддержки:
qsort(mList, 3, sizeof(*mList), textCompare);