Angenommen, ich habe ein Array von Zeigern in C verkohlen:Wie qsort ein Array von Zeigern auf Char in C?
char *data[5] = { "boda", "cydo", "washington", "dc", "obama" };
Und ich möchte dieses Array sortieren qsort mit:
qsort(data, 5, sizeof(char *), compare_function);
Ich bin nicht mit der Vergleichsfunktion zu entwickeln. Aus irgendeinem Grund funktioniert das nicht:
int compare_function(const void *name1, const void *name2)
{
const char *name1_ = (const char *)name1;
const char *name2_ = (const char *)name2;
return strcmp(name1_, name2_);
}
Ich habe viel von der Suche und fand, dass ich **
innerhalb von qsort verwenden musste:
int compare_function(const void *name1, const void *name2)
{
const char *name1_ = *(const char **)name1;
const char *name2_ = *(const char **)name2;
return strcmp(name1_, name2_);
}
Und das funktioniert.
Kann jemand die Verwendung von *(const char **)name1
in dieser Funktion erklären? Ich verstehe es überhaupt nicht. Warum der Doppelzeiger? Warum hat meine ursprüngliche Funktion nicht funktioniert?
Danke, Boda Cydo.
'data' sollte' const' deklariert werden. –
Billy, wenn es const ist, kann es noch sortiert werden? – bodacydo
Ja. Das Array kann nicht "const" sein, aber die Zeiger in diesem Array sollten "const" sein. Es ist nicht erlaubt, Konstantenliterale für die Kompilierungszeit so zu ändern (dies ist ein undefiniertes Verhalten). Um das zu bekommen, wollen Sie 'const char * data [5]'. Wenn Sie möchten, dass das Array selbst auch konstant ist, dann würden Sie 'const char * const data [5]' machen. –