Почему код ниже не сортирует названия месяцев?Базовый адрес правильный, количество элементов правильное, размер каждого элемента правильный, функция cmp
правильная.gcc -W -Wall -ansi -pedantic
не жалуется на писк.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int by_name(const void *a, const void *b) {
fprintf(stderr, "%p %p\n", a, b);
return strcmp((const char *)a, (const char *)b);
}
int main(void) {
char *months[] = {
"January",
"Februar",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
};
unsigned n;
qsort(months, sizeof months / sizeof *months, sizeof *months,
by_name);
for (n = 0; n < sizeof months / sizeof *months; ++n) {
fprintf(stderr, "%d %p %s\n", n, months[n], months[n]);
}
return 0;
}
Я добавил код, чтобы увидеть, что на самом деле делает qsort, вот результат.Мы видим, что адреса, которые qsort передает функции сравнения, полностью отличаются от того, где на самом деле находятся данные массива.Что не так?
Я использовал qsort много раз, в основном для сортировки структур всех видов, но никогда не было такого примитивного, как это (мне нужно декодировать действительно глупые строки даты и времени).
0x1ffeffffb8 0x1ffeffffc0
0x1ffeffffb0 0x1ffeffffb8
0x1ffeffffd0 0x1ffeffffd8
0x1ffeffffc8 0x1ffeffffd0
0x1ffeffffb0 0x1ffeffffc8
0x1ffeffffb8 0x1ffeffffc8
0x1ffeffffc0 0x1ffeffffc8
0x1ffeffffe8 0x1ffefffff0
0x1ffeffffe0 0x1ffeffffe8
0x1fff000000 0x1fff000008
0x1ffefffff8 0x1fff000000
0x1ffeffffe0 0x1ffefffff8
0x1ffeffffe8 0x1ffefffff8
0x1ffefffff0 0x1ffefffff8
0x1ffeffffb0 0x1ffeffffe0
0x1ffeffffb8 0x1ffeffffe0
0x1ffeffffc0 0x1ffeffffe0
0x1ffeffffc8 0x1ffeffffe0
0x1ffeffffd0 0x1ffeffffe0
0x1ffeffffd8 0x1ffeffffe0
0 0x10a00b January
1 0x10a013 Februar
2 0x10a01b March
3 0x10a021 April
4 0x10a027 May
5 0x10a02b June
6 0x10a030 July
7 0x10a035 August
8 0x10a03c September
9 0x10a046 October
10 0x10a04e November
11 0x10a057 December