Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Sintassi e differenze per la dichiarazioned dei puntatori.
Forum - C/C++ - Sintassi e differenze per la dichiarazioned dei puntatori.

Avatar
Dave Danuve (Normal User)
Newbie


Messaggi: 6
Iscritto: 13/04/2009

Segnala al moderatore
Postato alle 0:18
Mercoledì, 22/04/2009
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:

Codice sorgente - presumibilmente C/C++

  1. char **array2 = {
  2.                       "Anna",
  3.                       "Mario",
  4.                       "Carlo",
  5.                       "Tiziano",
  6.                       "Silvio",
  7.                       "Bernardo",
  8.                       "Matteo"
  9.                      };



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:

Codice sorgente - presumibilmente C/C++

  1. char *array2[] = {
  2.                       "Anna",
  3.                       "Mario",
  4.                       "Carlo",
  5.                       "Tiziano",
  6.                       "Silvio",
  7.                       "Bernardo",
  8.                       "Matteo"
  9.                      };



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:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int compare (const void *voidOne, const void *voidTwo);
  6.  
  7. int main (void)
  8. {
  9.    unsigned int i;
  10.    
  11.    char **array;
  12.    char *array2[] = {
  13.                       "Anna",
  14.                       "Mario",
  15.                       "Carlo",
  16.                       "Tiziano",
  17.                       "Silvio",
  18.                       "Bernardo",
  19.                       "Matteo"
  20.                      };
  21.    
  22.    array = malloc(7*sizeof(char *));
  23.    
  24.    for (i = 0; i < 7; i++)
  25.    {
  26.        array[i] = malloc( (strlen(array2[i]) + 1)*sizeof(char) );
  27.        strcpy(array[i], array2[i]);
  28.    }
  29.  
  30.    for (i = 0; i < 7; i++)
  31.       printf("%d. %s\n", i + 1, array[i]);  
  32.  
  33.    qsort(array, 7, sizeof(char *), compare);
  34.    
  35.    putchar('\n');  
  36.    
  37.    for (i = 0; i < 7; i++)
  38.       printf("%d. %s\n", i + 1, array[i]);
  39.    
  40.    for (i = 0; i < 7; i++)
  41.       free(array[i]);
  42.    
  43.    free(array);
  44.    
  45.    return 0;
  46. }
  47.  
  48. int compare (const void *voidOne, const void *voidTwo)
  49. {
  50.    char **one = (char **) voidOne;
  51.    char **two = (char **) voidTwo;
  52.    
  53.    return strcmp(*one, *two);
  54. }



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

PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 696
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 10:09
Mercoledì, 22/04/2009
Salve, la differenza e' che quando usi
Codice sorgente - presumibilmente C/C++

  1. char *array[]


dichiari un puntatore a un array dinamico di caratteri,
mentre se usi
Codice sorgente - presumibilmente C/C++

  1. char **array[]


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

Luigi  :k:

PM Quote
Avatar
Dave Danuve (Normal User)
Newbie


Messaggi: 6
Iscritto: 13/04/2009

Segnala al moderatore
Postato alle 13:53
Mercoledì, 22/04/2009
Testo quotato

Postato originariamente da gigisoft:

Salve, la differenza e' che quando usi
Codice sorgente - presumibilmente C/C++

  1. char *array[]


dichiari un puntatore a un array dinamico di caratteri,
mentre se usi
Codice sorgente - presumibilmente C/C++

  1. char **array[]


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

Luigi  :k:



No, io non ho usato

Codice sorgente - presumibilmente C/C++

  1. char **array[];



Ma ho usato

Codice sorgente - presumibilmente C/C++

  1. char **array;



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

PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 696
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 10:55
Venerdì, 24/04/2009
Testo quotato

Postato originariamente da Dave Danuve:

Testo quotato

Postato originariamente da gigisoft:

Salve, la differenza e' che quando usi
Codice sorgente - presumibilmente C/C++

  1. char *array[]


dichiari un puntatore a un array dinamico di caratteri,
mentre se usi
Codice sorgente - presumibilmente C/C++

  1. char **array[]


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

Luigi  :k:



No, io non ho usato

Codice sorgente - presumibilmente C/C++

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

Codice sorgente - presumibilmente C/C++

  1. char **array;



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


PM Quote