|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Mar 2006
Messaggi: 131
|
[C]segmantation fault in funzioni per inizializzare puntatori a char..
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.. |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Se devi restituire più valori, devi passare alla funzione un puntatore a puntatore a char. Nel main: Codice:
char *p1, *p2; func(&p1, &p2); Codice:
int func (char **p1, char **p2)
{
*p1 = malloc ........
....
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Mar 2006
Messaggi: 131
|
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??? |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Mar 2006
Messaggi: 131
|
Nella funzione:
Codice: int func (char **p1, char **p2) { *p1 = malloc (char**) etc.. } la malloc deve castare su un (char**) stavolta vero? |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Quote:
ciao
__________________
GPU Compiler Engineer |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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*.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Mar 2006
Messaggi: 131
|
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? |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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");
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Mar 2006
Messaggi: 131
|
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.. |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Immagino che quel arg1 sia uno di quei parametri char**. In questo caso devi usare le parentesi:
(*arg1)[nn]
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:46.




















