21/04/09 22:18
Dave Danuve
Buonasera a tutti. Stavo facendo delle prove per ordinare un array di stringhe con la funzione di libreria qsort quando sono incappato in un dilemma piuttosto curioso:
Avevo dichiarato un'array di stringhe in questo modo:
e quando andava a fare l'ordinamento (l'utilizzo della qsort era esatto), mi dava una bella segmentation fault.
Poi l'ho ridichiarato in questo modo:
E tutto ha funzionato alla perfezione, il che mi è sembrato molto strano o_O, contando che mi hanno sempre detto che tra * e [] non c'è differenza. Allora ho provato a copiare quell'array di stringhe statico in un nuovo array di stringhe dinamico ed effettuare l'ordinamento su quest'ultimo, in questo modo:
E anche qui non ha fatto una piega. Quindi io mi sto chiedendo come mai dichiarandolo statico col doppio puntatore (**) non funziona, mentre allocandolo dinamicamente funziona. Questa cosa mi causa una discreta confusione mentale ._.
Grazie in anticipo
Avevo dichiarato un'array di stringhe in questo modo:
char **array2 = { "Anna", "Mario", "Carlo", "Tiziano", "Silvio", "Bernardo", "Matteo" };
e quando andava a fare l'ordinamento (l'utilizzo della qsort era esatto), mi dava una bella segmentation fault.
Poi l'ho ridichiarato in questo modo:
char *array2[] = { "Anna", "Mario", "Carlo", "Tiziano", "Silvio", "Bernardo", "Matteo" };
E tutto ha funzionato alla perfezione, il che mi è sembrato molto strano o_O, contando che mi hanno sempre detto che tra * e [] non c'è differenza. Allora ho provato a copiare quell'array di stringhe statico in un nuovo array di stringhe dinamico ed effettuare l'ordinamento su quest'ultimo, in questo modo:
#include <stdio.h> #include <stdlib.h> #include <string.h> int compare (const void *voidOne, const void *voidTwo); int main (void) { unsigned int i; char **array; char *array2[] = { "Anna", "Mario", "Carlo", "Tiziano", "Silvio", "Bernardo", "Matteo" }; array = malloc(7*sizeof(char *)); for (i = 0; i < 7; i++) { array[i] = malloc( (strlen(array2[i]) + 1)*sizeof(char) ); strcpy(array[i], array2[i]); } for (i = 0; i < 7; i++) printf("%d. %s\n", i + 1, array[i]); qsort(array, 7, sizeof(char *), compare); putchar('\n'); for (i = 0; i < 7; i++) printf("%d. %s\n", i + 1, array[i]); for (i = 0; i < 7; i++) free(array[i]); free(array); return 0; } int compare (const void *voidOne, const void *voidTwo) { char **one = (char **) voidOne; char **two = (char **) voidTwo; return strcmp(*one, *two); }
E anche qui non ha fatto una piega. Quindi io mi sto chiedendo come mai dichiarandolo statico col doppio puntatore (**) non funziona, mentre allocandolo dinamicamente funziona. Questa cosa mi causa una discreta confusione mentale ._.
Grazie in anticipo
aaa