La page de manuel de la routine de bibliothèque qsort(3)
donne un exemple de tri des mots donnés comme arguments sur la ligne de commande. La fonction de comparaison se lit comme suit:La page de manuel de qsort (3) est-elle exacte?
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);
}
Mais ce qui est trié ici sont les éléments de argv
. Maintenant argv
est un pointeur vers des pointeurs de chars, qui peuvent être vus aussi comme une table de pointeurs aux chars. Par conséquent, ses éléments sont des pointeurs vers des caractères, donc les arguments réels de cmpstringp
ne devraient-ils pas être des pointeurs vers des caractères, et non des "pointeurs vers des pointeurs sur char"?
Si vous étiez en train de trier un tableau d'ints, auriez-vous alors prévu de transformer le 'const void * p1' en un' int' plutôt qu'un 'const int *'? Qu'en est-il d'un tableau de structures de 10 Ko, où les éléments sont beaucoup plus grands que le vide * pourrait être? –
Tout en travaillant à partir de ce code pour comprendre ce qui se passe est parfaitement raisonnable, vous voudrez peut-être reconsidérer le titre de votre question. Je veux dire, est-ce que vous vous rendez compte combien de temps cette manpage et ce code ont existé? Combien de * globes oculaires les ont-ils pris? – dmckee