4 Stimmen

Ist die Manpage von qsort(3) richtig?

Die Manpage des qsort(3) Bibliotheksroutine gibt ein Beispiel für die Sortierung von Wörtern, die als Argumente in der Befehlszeile angegeben werden. Die Vergleichsfunktion lautet wie folgt:

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);
       }

Aber was hier sortiert wird, sind die Elemente von argv . Jetzt argv ist ein Zeiger auf Zeiger von Zeichen, der auch als eine Tabelle von Zeigern auf Zeichen betrachtet werden kann.

Seine Elemente sind also Zeiger auf Zeichen, sollten also nicht die eigentlichen Argumente von cmpstringp Zeiger auf Zeichen sein, und nicht "Zeiger auf Zeiger auf Zeichen"?

7voto

Thomas Pornin Punkte 70790

Die Callback-Funktion, die als Argument an qsort() aufgerufen wird, als Argumente, Zeiger auf die beiden Werte zu vergleichen. Wenn Sie ein Array von char * (z.B.. argv[] ), dann sind die Werte char * (Zeiger auf char ) und die Vergleichsfunktion erhält Zeiger auf solche Werte, d. h. Zeiger auf Zeiger auf char .

2voto

pmg Punkte 102904
strcmp(\* (char \* const \*) p1, \* (char \* const \*) p2)
       ^^^^^^^^^^^^^^^^^^^^^

Donc p1 ist vom Typ * (char * const *) oder durch Entfernen der *'s (char * const) und char *const ist die Zuordnung kompatibel mit char * also kein Problem :-)

0voto

Oliver Charlesworth Punkte 259497

Nein, denn vermutlich würden Sie die qsort wie folgt:

qsort(&argv[0], argc, sizeof(char*), cmpstringp);

d.h. Sie übergeben ihm einen Zeiger auf ein Element, und ein Element ist ein const char * .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X