Re: segfault su Debian & su centos 5 no
Ciao, Il Dom, 30 Dicembre 2012 7:45 pm, emmanuel segura ha scritto: > Sto giocando con un piccolo e stupido programma in C che posto qua sotto, > sulla mia debian 6.0.6 va in segfault su una centos 5 no, la cosa stranna [...] > name_t pa[]; > > int main() > { > int i,SIZE = 255; > for(i = 0; i <= SIZE; i++) > { > pa[i].name = "Pippo"; > pa[i].id = i; > printf("\t%s - %d\n",pa[i].name,pa[i].id); > } > } Quale sarebbe il risultato atteso da questo programma? Io, vedendo che questo programma scrive dentro un array per il quale non è stata allocata memoria, mi aspetterei un "segfault". Quindi direi che la tua prova con Debian è andata più vicina al risultato atteso. Come ti hanno già scritto altri, attento ai messaggi del compilatore, il gcc dice chiaramente: /tmp/x.c:8:8: warning: array ‘pa’ assumed to have one element [enabled by default] Quindi, se 'pa' ha un elemento e tu ne scrivi 256... Ti consiglierei di cominciare il codice con #define SIZE 256 definire l'array con name_t pa[SIZE]; non ridichiarare la variabile SIZE dentro la funzione main e impostare il ciclo con: for(i = 0; i < SIZE; i++) ... poi leggere un buon manuale sul C, al capitolo sui puntatori. Infine compilare con 'gcc -Wall' e leggere _tutti_ i "warning" che il compilatore tira fuori. Buono studio, m -- http://bodrato.it/software/combinatorics.html -- Per REVOCARE l'iscrizione alla lista, inviare un email a debian-italian-requ...@lists.debian.org con oggetto "unsubscribe". Per problemi inviare un email in INGLESE a listmas...@lists.debian.org To UNSUBSCRIBE, email to debian-italian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/36307.151.32.166.21.1356948957.squir...@mail.dm.unipi.it
Re: segfault su Debian & su centos 5 no
Ciao Bodrato Capisco il tuo consiglio e ti rigranzio, ma comunque non mi spiego perche su debian a 64 non funziona invece su una debian a 32bit e su centos 32 bit si Il giorno 31 dicembre 2012 11:15, ha scritto: > Ciao, > > Il Dom, 30 Dicembre 2012 7:45 pm, emmanuel segura ha scritto: > > Sto giocando con un piccolo e stupido programma in C che posto qua sotto, > > sulla mia debian 6.0.6 va in segfault su una centos 5 no, la cosa stranna > > [...] > > > name_t pa[]; > > > > int main() > > { > > int i,SIZE = 255; > > for(i = 0; i <= SIZE; i++) > > { > > pa[i].name = "Pippo"; > > pa[i].id = i; > > printf("\t%s - %d\n",pa[i].name,pa[i].id); > > } > > } > > Quale sarebbe il risultato atteso da questo programma? > > Io, vedendo che questo programma scrive dentro un array per il quale non > è stata allocata memoria, mi aspetterei un "segfault". Quindi direi che > la tua prova con Debian è andata più vicina al risultato atteso. > > Come ti hanno già scritto altri, attento ai messaggi del compilatore, il > gcc dice chiaramente: > /tmp/x.c:8:8: warning: array ‘pa’ assumed to have one element [enabled > by default] > > Quindi, se 'pa' ha un elemento e tu ne scrivi 256... > > Ti consiglierei di cominciare il codice con > #define SIZE 256 > > definire l'array con > name_t pa[SIZE]; > > non ridichiarare la variabile SIZE dentro la funzione main e impostare il > ciclo con: > for(i = 0; i < SIZE; i++) > > ... poi leggere un buon manuale sul C, al capitolo sui puntatori. > > Infine compilare con 'gcc -Wall' e leggere _tutti_ i "warning" che il > compilatore tira fuori. > > Buono studio, > m > > -- > http://bodrato.it/software/combinatorics.html > > -- esta es mi vida e me la vivo hasta que dios quiera
Re: segfault su Debian & su centos 5 no
Il 31/12/2012 12:14, emmanuel segura ha scritto: Ciao Bodrato Capisco il tuo consiglio e ti rigranzio, ma comunque non mi spiego perche su debian a 64 non funziona invece su una debian a 32bit e su centos 32 bit si bisogna capire perchè in un caso si và a scrivere nella memoria del processo e nell'altro và a scrivere nella memoria di un altro processo o nella memoria di sistema. In un caso, dopo la dichiarazione in memoria di name_t pa[]; c'è della memoria allocata 'disponibile' (allocata dal sistema) nell'altro no. Nei sistemi a 64 bit forse alloca solo la dimensione del tipo di variabile, nei 32 bit magari alloca un segmento di non sò quanti bytes. Prova a fargli fare un loop più lungo finchè non fà 'boom'. -- -- Meglio un uovo oggi che una gallina domani -- Per REVOCARE l'iscrizione alla lista, inviare un email a debian-italian-requ...@lists.debian.org con oggetto "unsubscribe". Per problemi inviare un email in INGLESE a listmas...@lists.debian.org To UNSUBSCRIBE, email to debian-italian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/50e176a7.9020...@gmail.com
Re: segfault su Debian & su centos 5 no
On 31/12/2012 12:14, emmanuel segura wrote: non mi spiego perche su debian a 64 non funziona invece su una debian a 32bit e su centos 32 bit attenzione, non funziona. Sembra funzionare, ma non funziona. Il segfault non è detto che avvenga sempre allo stesso modo e nello stesso punto. > typedef struct Name { > char *name; > int id; > } name_t; > > name_t pa[]; pa[i].name = "Pippo"; per esempio sai cosa fa quest'istruzione? Di certo non inserisce in name la stringa "Pippo\0". name è una variabile che contiene un numero: un indirizzo di memoria. Quello che probabilmente fa con quel ciclo è far si che tutti i puntatori pa[i].name contengano lo stesso valore numerico (indirizzo) che corrisponde alla memoria dove è contenuta la costante "Pippo". Però non è detto che questo venga fatto con ogni compilatore, perché non è questo il modo per assegnare i valori ad un puntatore. Inoltre, sembra funzionare, perché gli stai soltanto dicendo di andare alla posizione 'i' a partire dalla posizione 0 allocata con la dichiarazione di pa[] e se quell'area di memoria è accessibile, allora la usa... ma potrebbe essere usata contemporaneamente da altro... se non c'è null'altro che usa quell'area di memoria, allora il tuo programma sembra funzionare, altrimenti o hai dei malfunzionamenti o un segfault. Ciao Davide -- Dizionari: http://linguistico.sourceforge.net/wiki Petizione per l'uso di formati accessibili nell'Unione Europea http://tinyurl.com/y6u4m5 Non autorizzo la memorizzazione del mio indirizzo su outlook -- Per REVOCARE l'iscrizione alla lista, inviare un email a debian-italian-requ...@lists.debian.org con oggetto "unsubscribe". Per problemi inviare un email in INGLESE a listmas...@lists.debian.org To UNSUBSCRIBE, email to debian-italian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/50e17f1b.7000...@gmail.com
Re: [OT] programmazione in C [era: segfault su Debian & su centos 5 no]
Ciao, Il Lun, 31 Dicembre 2012 12:14 pm, emmanuel segura ha scritto: > Capisco il tuo consiglio e ti rigranzio, ma comunque non mi spiego perche > su debian a 64 non funziona invece su una debian a 32bit e su centos 32 Invece devo essermi spiegato male. Quel programma, per le istruzioni che contiene, richiede di scrivere in aree di memoria su cui il programma stesso non dovrebbe scrivere. Questo, in qualunque sistema operativo che preveda il controllo della memoria, fornirà un errore durante l'esecuzione. Quindi il sistema che ti dà "segfault" prima è quello che "funziona meglio". Un programma funziona se è scritto coscienziosamente dal programmatore in modo tale da dare sempre il risultato atteso, non se per ragioni fortuite dà in qualche caso il risultato che il programmatore avrebbe voluto. La porzione di codice che hai scritto contiene degli errori, evidenziati dai partecipanti a questa lista e dai "warning" di qualunque compilatore. Invece di interrogarti sul perché in qualche caso fortunato quegli errori non vengono a galla, ti consiglio nuovamente di rimuoverli. Colgo l'occasione per fare a tutti gli auguri di buon veglione, buon capodanno e di un Magnifico 2013! Cià, m -- http://bodrato.it/software/strassen.html -- Per REVOCARE l'iscrizione alla lista, inviare un email a debian-italian-requ...@lists.debian.org con oggetto "unsubscribe". Per problemi inviare un email in INGLESE a listmas...@lists.debian.org To UNSUBSCRIBE, email to debian-italian-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/37360.151.32.246.240.1356959324.squir...@mail.dm.unipi.it