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!