qsort() anwenden



  • Hallo,

    ich möchte mit qsort() ein Zeichenketten-Array sortieren. Zur Vereinfachung habe ich folgendes Testprogramm geschrieben. Die main() bekommt ein Zeichenketten-Array übergeben, welches in ein anderes Zeichenketten-Array buffer umgeschrieben wird. Ohne die Variable buffer zu verwenden (direkt über argv[]), funktioniert mein Programm (wie auch in der man-page beschrieben). Sobald ich aber buffer verwende, bekomme ich beim Aufruf von qsort() einen Segmentation Fault.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
    
    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);
    }
    
    int main(int argc, char *argv[])
    {
        int j;
    
        assert(argc > 1);
    
        char buffer[argc-1][50];
    
        for (j=1; j<argc; j++) strcpy(buffer[j-1],argv[j]);
    
        qsort(&buffer[0], argc - 1, sizeof(char *), cmpstringp); //hier wird der segmentation fault ausgelöst
    
        for (j = 0; j < argc-1; j++) printf("%s\n",buffer[j]);
    
        return 0;
    }
    

    Ich frage mich nur, warum mit dem Aufruf von qsort() dieser Segmentation Fault ausgelöst wird. Arraygrentzen werden (soweit ich das sehe) nicht überschritten.



  • Siegfried1 schrieb:

    Ich frage mich nur, warum mit dem Aufruf von qsort() dieser Segmentation Fault ausgelöst wird. Arraygrentzen werden (soweit ich das sehe) nicht überschritten.

    Dieser Segmentation Fault wird in Deiner cmpstringp Funktion ausgelöst.

    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);
        return strcmp (p1, p2); // so geht's
    }
    

    Ein weiterer "Fehler" ist das 3. Argument beim Aufruf von qsort . Das sollte so aussehen:

    qsort(&buffer[0], argc - 1, 50, cmpstringp);
    

    Eine Zeichenkette ist bei Dir ja 50 Byte groß und nicht sizeof (char*) .

    Nun sortiert er auch 🙂



  • Danke! 🙂


Anmelden zum Antworten