Oppure

Loading
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:

   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
22/04/09 8:09
gigisoft
Salve, la differenza e' che quando usi
char *array[]

dichiari un puntatore a un array dinamico di caratteri,
mentre se usi
char **array[]

dichiari un puntatore a un puntatore a un array dinamico di caratteri.

Luigi :k:
aaa
22/04/09 11:53
Dave Danuve
Postato originariamente da gigisoft:

Salve, la differenza e' che quando usi
char *array[]

dichiari un puntatore a un array dinamico di caratteri,
mentre se usi
char **array[]

dichiari un puntatore a un puntatore a un array dinamico di caratteri.

Luigi :k:


No, io non ho usato

char **array[];


Ma ho usato

char **array;


Che cos'è esattamente un "array dinamico di caratteri"? Io pensavo che fosse un normale puntatore non inizializzato, o sbaglio?
aaa
24/04/09 8:55
gigisoft
Postato originariamente da Dave Danuve:

Postato originariamente da gigisoft:

Salve, la differenza e' che quando usi
char *array[]

dichiari un puntatore a un array dinamico di caratteri,
mentre se usi
char **array[]

dichiari un puntatore a un puntatore a un array dinamico di caratteri.

Luigi :k:


No, io non ho usato

char **array[];


OK, ma la sostanza non cambia, quando scrivi

**X

e' come se scrivessi

*(*X)

cioe' un puntatore a un puntatore

Luigi

Ma ho usato

char **array;


Che cos'è esattamente un "array dinamico di caratteri"? Io pensavo che fosse un normale puntatore non inizializzato, o sbaglio?
aaa