PDA

Visualizza la versione completa : Differenze dichiarazione stringa


Dreamer89
24-10-2009, 12:53
Salve a tutti. Ho creato un semplice programma che conta quante parole di un testo sono formate da tre lettere:


#include <stdio.h>
#include <string.h>

int getWordsNumberWith3Letters (char text[]);

int main()
{
char text[] = "tre tigri contro tre gatti";
int counter = getWordsNumberWith3Letters (text);

printf ("%d\n", counter);

return 0;
}

int getWordsNumberWith3Letters (char *text)
{
int counter = 0;

char *word = strtok (text, " ");
while (word != NULL)
{
if (strlen (word) == 3)
counter++;

word = strtok (NULL, " ");
}

return counter;
}

Il programma cos com' funziona correttamente, ma se provo a cambiare questo:

char text[] = "tre tigri contro tre gatti";
con questo:

char *text = "tre tigri contro tre gatti";

Avviando il programma mi compare il messaggio:"Segmentation Fault" :O
Perch?

oregon
24-10-2009, 13:52
Nel primo caso viene effettivamente creato un array (nello stack), nel secondo viene solamente creato un puntatore ma il testo viene conservato nel codice.

Dato che la strtok va a scrivere nell'array, nel primo caso funziona (in quanto e' lecito scrivere nello stack) mentre nel secondo hai l'errore (in quanto e' vietato scrivere nell'area del codice).

Dreamer89
24-10-2009, 14:01
Originariamente inviato da oregon
Nel primo caso viene effettivamente creato un array (nello stack), nel secondo viene solamente creato un puntatore ma il testo viene conservato nel codice.

Dato che la strtok va a scrivere nell'array, nel primo caso funziona (in quanto e' lecito scrivere nello stack) mentre nel secondo hai l'errore (in quanto e' vietato scrivere nell'area del codice).

Ah ok grazie mille! Ho sempre pensato che fosse la stessa cosa, dato che un array di char sempre un puntatore no? o_O

oregon
24-10-2009, 14:06
Originariamente inviato da Dreamer89
Ah ok grazie mille! Ho sempre pensato che fosse la stessa cosa, dato che un array di char sempre un puntatore no? o_O

Un "array di char" e un "puntatore" sono cose diverse.

Il nome di un array di char e' anche il puntatore al suo primo elemento.

Ma se esiste solamente un puntatore, non e' detto che esista l'area allocata o che sia in una zona di memoria in cui si puo' anche scrivere ...

Loading