Newsgroup: it.comp.lang.c
Titolo: Perche' errore di segmentation fault?

Scusate, ma perche' questo programma mi da' in esecuzione errore di
segmentation fault ?
 #include <stdio.h>
int main(int argc, char *argv[], char *env[]) 
{ int i=0; int l=0;
int word=0;
char *querystring;
querystring=malloc(sizeof(char)*100000); 
// if ((char *)getenv("QUERY_STRING")==NULL)
//strcpy(querystring,"QUERY_STRING\0"); 
//else
//strcpy(querystring,(char *) getenv("QUERY_STRING")); 
//l=strlen((char *)getenv("QUERY_STRING")); 
//printf("%d \n",l);
strcpy(querystring,(char *) getenv("QUERY_STRING")); 
i=0;word=0;
printf("Stampa di QUERY_STRING\n");
printf("QUERY_STRING=%s\n",querystring); 
//while (querystring[i]!='\0')
//{
//printf("Parola %d",word++);
//while (querystring[i]!='&')
//{
//printf("%c",querystring[i]);
//i++;
//}
//i++;
//}
}
Frank

 strcpy(querystring,(char *) getenv("QUERY_STRING")); 
Se getenv non trova la variabile specificata ritorna NULL, quindi fai 
qualcosa di questo tipo:
char *temp;
temp=getenv("QUERY_STRING");
if(temp==NULL){
	/*gestisci errore*/
}else{
	strcpy(querystring,temp);
}
-- 
Devaraja (Xdevaraja87^gmail^c0mX)
Linux Registerd User #338167
http://counter.li.org

 strcpy(querystring,(char *) getenv("QUERY_STRING")); 
forse perche' QUERY_STRING non e' settata e getenv ritorna NULL.
Tommaso
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 }
Frank

 un confronto tra un intero ed un puntatore senza un cast
Ma dove lo vede l'intero? Ho appena compilato con tutti i warning attivi 
e non mi dice niente. Posta tutto il messaggio di errore.


 e non mi dice niente. Posta tutto il messaggio di errore.
Ecco l'errore che mi da gcc
prova_getenv.c:9: warning: assignment makes pointer from integer without a cast
Frank

 prova_getenv.c:9: warning: assignment makes pointer from integer without a cast
e' una warning non un errore.
probabilmente hai scritto
char temp;
...
if(temp = NULL){
invece di:
char *temp;
...
if(temp == NULL){
insomma credo tu abbia fatto 2 errori in 3 righe.


 insomma credo tu abbia fatto 2 errori in 3 righe.
No, avevo copiato come avevi detto tu, solo che poi mi ero fatto
confondere dal messaggio di warning.
Frank

 prova_getenv.c:9: warning: assignment makes pointer from integer without a cast
Ciao,
 hai incluso il file stdlib.h?
 Ciao
 Federico

 sizeof(char)==1
Ciao,
 questo non e' proprio vero in generale ... Se vuoi un programma 
portabile, non puoi prenderlo come assunzione.
 Ciao
 Federico



No, l'avevo dimenticata. Ora la aggiungo
Ciao
Francesco

OK, ora il programma funziona, fino ad un certo punto
La seconda parte del programma, invece, quella che scandisce la stringa,
va in segmentation fault. Se elimino il ciclo interno, il programma
funziona, e la stringa viene stampata carattere per carattere
Se invece aggiungo il ciclo interno, il programma mi va in segmentation
fault
 // Analisi di querystring 
while (querystring[i]!='\0') 
{ 
	j=i; 
while (querystring[j]!='&')
  {
    printf("%c ",querystring[j]);
    j=j+1;
   }
i=j+1;
printf("\n");
}
Francesco

Federico Zema ha scritto:

dallo standard:
   6.5.3.4 The sizeof operator
3 When applied to an operand that has type char, unsigned char,
   or signed char, (or a qualified version thereof) the result
   is 1.
Esistono implementazioni del c che non seguono lo standard, ma allora 
non si dovrebbe essere sicuri nemmeno di molte altre cose... Comunque in 
generale hai ragione tu, per quello che costa si puo' anche scrivere 
sizeof(char)...


Lampa Dario ha scritto:

Il while esterno controlla di non andare oltre lo 0 terminatore, ma 
quello interno no, quindi va a leggere anche oltre la fine della 
stringa, fino a quando non trova un '&'. Dato che quello che c'e' oltre 
la stringa non e' roba del tuo programma, causi una segmentation fault. 
Puoi risolvere aggiungendo una '&' alla fine della stringa o ancora 
meglio modifica la condizione del while interno.
