View Full Version : [C]segmantation fault in funzioni per inizializzare puntatori a char..
santaclause83
30-05-2007, 10:26
1)ho fatto una funzione che tra i parametri riceve dei puntatori a char
2)e questi vengono allocati e inizializzati nel corpo della funzione stessa
firma della funzione
int leggifun(char* comandi,char* arg1,char* arg2,char* arg3,char* arg4);/*prende la stringa "comandi" e inizializza gli array di stringhe a seconda del comando da inviare al server,restituisce un int a seconda del codice operativo che rappresenta il comando e restituisce 9 se la stringa è inizializzata male*/
funzione nel main
char *punt,*uno,*due,*tre,*quattro;
int res;
res = leggifun(punt,uno,due,tre,quattro);
DOMANDA-->la chiamata della funzione nel main una volta eseguita dovrebbe avere i puntatori inizializzati no?
..le stampe di controllo che continuano a restituirmi segmentation fault..
DOMANDA-->la chiamata della funzione nel main una volta eseguita dovrebbe avere i puntatori inizializzati no? No, perché così i puntatori ritornati dalla funzione di allocazione (malloc o comunque quello che hai usato) li assegni ai parametri della funzione, che sono una copia dei valori presenti nelle variabili del main. Le variabili nel main non verrebbero modificate in alcun modo.
Se devi restituire più valori, devi passare alla funzione un puntatore a puntatore a char.
Nel main:
char *p1, *p2;
func(&p1, &p2);
Nella funzione:
int func (char **p1, char **p2)
{
*p1 = malloc ........
....
}
santaclause83
30-05-2007, 11:43
adesso però ho difficoltà a lavorare con le stringhe all'interno della funzione,mentre per esempio prima c'era un while che scorreva un array di char e copiava il suo contenuto dentro un altro array di char in questo modo:
while(comandi[i] != ' '){
arg1[i] = comandi[i];
i++;}
adesso l'ho modificato mettendo un * prima del puntatore a puntatore di char e cicla tre volte,indipendentemente dal while e mi va in segmentation fault
premetto che arg1 l'ho dichiarato come ** nella firma della funzione e dentro la funzione lo inizializzo con una malloc a *arg = etc...
while(comandi[i] != ' '){
*arg1[i] = comandi[i];
i++;}
suggerimenti???
santaclause83
30-05-2007, 11:55
Nella funzione:
Codice:
int func (char **p1, char **p2)
{
*p1 = malloc (char**) etc..
}
la malloc deve castare su un (char**) stavolta vero?
AnonimoVeneziano
30-05-2007, 12:11
Nella funzione:
Codice:
int func (char **p1, char **p2)
{
*p1 = malloc (char**) etc..
}
la malloc deve castare su un (char**) stavolta vero?
no , devi dare *p1 = (char *) malloc(sizeof(char)*dim_array);
ciao
Nella funzione:
la malloc deve castare su un (char**) stavolta vero?No. Io nell'esempio non messo cast per brevità (e tra l'altro in ANSI C non è obbligatorio un cast esplicito da void* a un altro tipo* e viceversa).
Comunque il cast andrebbe fatto come (char*) perché il puntatore fornito da malloc lo devi assegnare alla variabile puntata dall'indirizzo passato, che è appunto quella nel main dichiarata char*.
santaclause83
30-05-2007, 12:19
si grazie,visto subito,era improbabile che potesse essere così...è che la disperazione da ore su un seg fault mi fa pensare a questo e ad altre assurdità
come lo scorro adesso però l'array di ** a char per inizializzarlo con i valori del puntatore "comandi" senza cascare nel fallo di segmentazione?
come lo scorro adesso però l'array di ** a char per inizializzarlo con i valori del puntatore "comandi" senza cascare nel fallo di segmentazione?Dipende da cosa devi fare ... tra l'altro perché dici "l'array di ** a char"???
Tu nella funzione hai dei puntatori, es. char **p1, e dove *p1 punta al blocco di memoria allocato. Puoi fare ad esempio:
strcpy (*p1, "Ciao");
santaclause83
30-05-2007, 13:05
ok,nel caso però in cui voglia copiare una parte di stringa nell'area puntata da *p?
prendendo dal ciclo precedente non ho fatto altro che aggiungere un * che arg1 essendo stato dichiarato come puntatore a stringa non aveva
"comandi" è la stringa da scorrere fino allo spazio vuoto e copiare in arg1
while(comandi[i] != ' '){
*arg1[i] = comandi[i];
i++;}
ma dopo 3 cicli restituisce segmentation fault..
*arg1[i] = comandi[i];Immagino che quel arg1 sia uno di quei parametri char**. In questo caso devi usare le parentesi:
(*arg1)[nn]
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.