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"?

È stato utile?

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 *.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top