È la pagina di manuale di qsort (3) giusto?
Domanda
La pagina di manuale della routine di libreria qsort(3)
fornisce un esempio di ordinamento delle parole date come argomenti sulla riga di comando. La funzione di confronto è formulato come segue:
static int
cmpstringp(const void *p1, const void *p2)
{
/* The actual arguments to this function are "pointers to
pointers to char", but strcmp(3) arguments are "pointers
to char", hence the following cast plus dereference */
return strcmp(* (char * const *) p1, * (char * const *) p2);
}
Ma ciò che è stato ordinato qui sono gli elementi di argv
. Ora argv
è un puntatore ai puntatori di caratteri, che può essere visto anche come una tabella di puntatori a caratteri.
Quindi i suoi elementi sono puntatori a caratteri, in modo da non dovrebbero gli argomenti reali di cmpstringp
essere puntatori a caratteri, e non "puntatori a puntatori a char"?
Soluzione
La funzione di callback passata come argomento a qsort()
viene chiamato con, come argomenti, puntatori a i due valori da confrontare. Se si ordina un array di char *
(ad esempio argv[]
) allora i valori sono char *
(puntatori a char
) e la funzione di confronto riceverà puntatori a tali valori, cioè puntatori ai puntatori a char
.
Altri suggerimenti
strcmp(* (char * const *) p1, * (char * const *) p2) ^^^^^^^^^^^^^^^^^^^^^
Quindi p1
è di tipo * (char * const *)
o, rimuovendo * 's (char * const)
; e char *const
è compatibile con l'assegnazione char *
, quindi nessun problema: -)
No, perché presumibilmente si sarebbe chiamata qsort
come segue:
qsort(&argv[0], argc, sizeof(char*), cmpstringp);
vale a dire. si passa un elemento puntatore a, e un elemento è un const char *
.