Newsgroup: it.comp.lang.c
Titolo: Aiuto codice ridicolo che mi da errore!

Ciao a tutti, sto scrivendo un programmino ridicolo, ma utile per farmi 
capire come funziona il C!
Così il codice funziona:
int main(){
     char a[]={"primo "},b[]={"secondo "},c[]={"terzo"};
     char *array[200];
 
	 array[0][0]=a[0];
 
	 printf("array: %c\n",array[0][0]);
 
	 return 0;
}
infatti:
$ gcc prova_stringhe.c -o prova_stringhe
prova_stringhe.c:14:2: warning: no newline at end of file
francesco@2[Informatica]$ ./prova_stringhe
array: p
Così non funziona più!
int main(){
     char a[]={"primo "};//,b[]={"secondo "},c[]={"terzo"};
     char *array[200];
 
	 array[0][0]=a[0];
 
	 printf("array: %c\n",array[0][0]);
 
	 return 0;
}
infatti:
$ gcc prova_stringhe.c -o prova_stringhe
prova_stringhe.c:14:2: warning: no newline at end of file
francesco@2[Informatica]$ ./prova_stringhe
Segmentation fault
Qualche anima pia mi potrebbe spiegare il perchè di quel "Segmentation 
fault", dato che rispetto al codice funzionante ho solo tolto due 
stringhe, "b" e "c", che non vengono usate!!!
Domanda aggiuntiva,quel warning come si toglie? Credevo bastasse dare 
invio dopo l'ultima graffa chiusa, ma evidentemente mi sbagliavo!
Grazie a chiunque voglia aiutarmi!
Francesco
-- 
Per rispondermi in privato togliere i numeri!

 stringhe, "b" e "c", che non vengono usate!!!
Veramente non sta scritto da nessuna parte che quel codice debba 
funzionare, dato che provoca un comportamento indefinito.
 >     char a[]={"primo "},b[]={"secondo "},c[]={"terzo"};
Le parentesi sono inutili se inizializzi con una literal. E poi e' 
meglio mettere una dichiarazione per riga, soprattutto se inizializzi. 
Funziona comunque anche il tuo codice, e' solo un po' scomodo.
 >     char *array[200];
 >
 >      array[0][0]=a[0];
Qui dichiari un array di 200 puntatori a char, ma non inizializzi quei 
puntatori, quindi puntano a 200 indirizzi sconosciuti. A questo punto la 
seconda istruzione prende il primo puntatore (*non inizializzato*), 
prende il primo carattere di un array a cui dovrebbe puntare (*ma a cui 
non punta*) e ci scrive il primo char dell'array a. Quindi ti basta 
aggiungere array[0]=malloc(1) per rendere valida l'istruzione 
array[0][0]=a[0]. Ovviamente se vuoi copiare piu' di un carattere o una 
stringa (anche di un solo carattere) dovresti usare 
array[0]=malloc(strlen(stringa))
-- 
Devaraja (Xdevaraja87^gmail^c0mX)
Linux Registerd User #338167
http://counter.li.org

 puntatori, quindi puntano a 200 indirizzi sconosciuti.
Che io sappia, il C inizializza le componenti degli array a zero.
Quindi array[0] e´ NULL, e quando scrivi array[0][0] stai deferanziando un 
puntatore NULL: il segmentation fault e´ automatico!
Concordo in pieno sull´uso della malloc *prima* di scriverci dentro 
qualunque cosa!
 Ciao
 Federico

 Che io sappia, il C inizializza le componenti degli array a zero.
Non lo sapevo. Comunque l'effetto e' lo stesso: non vanno utilizzati.


  Federico
Ciao
Matix

 Che io sappia, il C inizializza le componenti degli array a zero.
e questo da quando?? No, hai torto.
int a[128];
// array di 128 interi, NON inizializzati 
// (potrebbero anche valere tutti 0 come potrebbero avere qualsiasi
valore random)
int b[128] = {0};
// array di 128 interi, TUTTI inizializzati a 0.
Tommy
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 
Allora avevo ragione... dai sto ancora imparando non mandatemi in casino 
in questo modo :-)


 e questo da quando?? No, hai torto.
Urca, e' vero! Solo gli aray globali vengono inizializati automaticamente 
.... Chiedo scusa per la fesseria che mi e' scappata :-(
In realta' non bado molto a queste finezze perche' tutte le volte che
compilo passo una marea di opzioni di warning al gcc, quindi qualunque
riga vagamente "dubbiosa" mi viene segnalata...
Comunque DevarajA aveva centrato da subito il problema; in questo caso 
specifico, non inizializzato o NULL e' egualmente dannoso.
Sorry ancora!
 Ciao
 Federico

 }
-- 
Horst