PDA

Visualizza la versione completa : [C] Accesso al puntatore genera "Segmentation Fault"


Dzamir
27-03-2007, 19:02
Ciao a tutti, ho programmato in C per parecchio tempo e mi sento un niubbo a fare una domanda del genere, ma purtroppo non ne riesco ad uscirne da solo e quindi chiedo aiuto in ginocchio :mame:
Stavo compilando un programmino in C con l'Eclipse su Linux, ma ho fatto caso che il programma mi si blocca e viene scritto "Segmentation Fault (core dumped)" ogni qual volta che cerco di accedere al contenuto di una stringa nel modo seguente:


char c = 'a';
char * test;
test = (char*) malloc(20);
test = "questa una prova";
test[0] = c; // qui si blocca il programma
test[0] = (int)c; // se eseguo questa istruzione invece tutto ok

In pratica se setto il char mi si blocca tutto, se lo casto ad int funziona alla perfezione... ma la stringa un array di char!! Buh, mi sento terribilmente ignurante.. Per ora ho messo il cast ad int ma non mi sembra per niente una cosa pulita! :malol:

oregon
27-03-2007, 19:13
Il problema e' in questa linea

test = "questa una prova";

che dovrebbe essere

strcpy(test, "questa una prova");

Il fatto che ti dia un errore o meno a seconda del cast e' casuale ... in realta' dovrebbe darlo sempre ...

Samuele_70
27-03-2007, 19:14
Dichiari un puntatore...
char * test;

Gli assegni una zona di memoria allocata dinamicamente
test = (char*) malloc(20);
Che in realt dovrebbe essere :
test = malloc(sizeof(char)*20);
(il cast non serve in c)

test = "questa una prova";
Qui assegni allo stesso puntatore l'idirizzo di una stringa literal
che non modificabile in nesun modo.
e la zona di memoria allocata in precedenza non pi utilizzabile...

Soluzione : utilizza la funzione standard strcpy()
strcpy( test, "questa una prova");

Ciao.

shodan
27-03-2007, 19:16
Hanno detto tutto Samuele e Oregon

Dzamir
27-03-2007, 19:18
Avevo appena risolto, comunque grazie mille lo stesso! :D
Mi ero un p arrugginito in c :fagiano:

XWolverineX
27-03-2007, 19:19
Credo che l'errore sia dovuto al fatto che questa istruzione



test = "questa una prova";

Non copia la stringa "questa una prova" nel puntatore test, ma fa puntare test a "questa una prova".
In C++ infatti, i "caratteri liberi", come li chiamo io, sono considerati dei const char *, e quindi dei puntatori.
Inoltre non hai liberato la memoria allocata con malloc (usa free())
Il codice corretto quindi



int main()
{
char c = 'a';
char * test;
test = (char*) malloc(20);
strcpy(test,"questa una prova");
test[0] = c;
free(test);
return 0;
}


Oppure puoi anche sostiturie


test = (char*) malloc(20);
strcpy(test,"questa una prova");


con

test = strdup("questa una prova");
che provvede in automatico all'allocazione.

XWolverineX
27-03-2007, 19:21
abbiamo risposto 3 di noi assieme

Samuele_70
27-03-2007, 19:21
Originariamente inviato da shodan
Hanno detto tutto Samuele e Oregon
Possiamo anche aggiungere che era un esempio di memory leak (http://it.wikipedia.org/wiki/Memory_leak) :)

shodan
27-03-2007, 19:48
Gi :dh:

Beh aggiungo solo che meglio la strncpy che la strcpy, almeno si sa quanto si copia :)

XWolverineX
27-03-2007, 21:09
Se devi copiare un'intera stringa, non vedo perch usare strncpy

Loading