getc() segmentation fault

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: getc() segmentation fault

Messaggio da targzeta »

Non ho capito se ti riferisci a me e se l'elemento in più è nel vettore v. Comunque, se è così, l'elemento che dici apparentemente inutile e in più, in realtà è utile e non è in più.
Se dichiari un array lungo v[MAX] allora l'array contiene MAX celle da v[0] a v[MAX-1]. Se dichiari un array lungo v[MAX-1], come hai fatto tu, allora hai MAX-1 celle da v[0] a v[MAX-2].
Generalmente si usa la prima forma e quindi ho modificato quanto fatto da te senza badare se lo usavi bene o male. Diciamo che l'istinto mi suggeriva che l'errore era nella gestione dell'array v.

Per quanto riguarda la funzione getc, se gestisci male i puntatori allora l'errore può avvenire ovunque nel codice. Ad esempio potresti aver sovrascitto la struttura f che puntava al file aperto, e quindi di conseguenza alla funzione getc non passavi più ciò che pensavi di passare. E' solo un ipotesi, ma è la ragione per cui mi sono concentrato sui puntatori.

Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: getc() segmentation fault

Messaggio da anycolouryoulike »

spina ha scritto:Non ho capito se ti riferisci a me e se l'elemento in più è nel vettore v. Comunque, se è così, l'elemento che dici apparentemente inutile e in più, in realtà è utile e non è in più.
Se dichiari un array lungo v[MAX] allora l'array contiene MAX celle da v[0] a v[MAX-1]. Se dichiari un array lungo v[MAX-1], come hai fatto tu, allora hai MAX-1 celle da v[0] a v[MAX-2].
Generalmente si usa la prima forma e quindi ho modificato quanto fatto da te senza badare se lo usavi bene o male. Diciamo che l'istinto mi suggeriva che l'errore era nella gestione dell'array v.

Per quanto riguarda la funzione getc, se gestisci male i puntatori allora l'errore può avvenire ovunque nel codice. Ad esempio potresti aver sovrascitto la struttura f che puntava al file aperto, e quindi di conseguenza alla funzione getc non passavi più ciò che pensavi di passare. E' solo un ipotesi, ma è la ragione per cui mi sono concentrato sui puntatori.

Spina
Pensa che ero convinto che v[MAX] significasse un vettore di MAX + 1 elementi!
Grazie ora è tutto chiaro.
robbybby ha scritto:

Codice: Seleziona tutto

char *v[MAX]
Grazie, era proprio questo l'errore!
Non ci avevo neanche fatto caso...

Grazie a tutti!

Avatar utente
robbybby
Linux 4.x
Linux 4.x
Messaggi: 1223
Iscritto il: sab 16 dic 2006, 10:48
Slackware: 13.1 / 64 bit
Kernel: 3.3.x
Desktop: KDE 4.4.5
Località: Fra Trantor e Terminus

Re: getc() segmentation fault

Messaggio da robbybby »

Mario Vanoni ha scritto: v[MAX]
ma dove posizioni lo \0 finale?

v[MAX + 1];
Mario, v e' usato come un array di stringhe, non come una stringa in se' (o puntatore a caratteri che dir si voglia).
v e' un puntatore a puntatori a caratteri (char **) e non un puntatore a caratteri (char*). Infatti e' dichiarato come

Codice: Seleziona tutto

char *v[MAX]
, e non come

Codice: Seleziona tutto

char v[MAX+1]
.
Lui, dentro ogni elemento, ci mette una stringa intera, con gia' il suo NULL terminator, quindi l'ultimo elemento non lo usa proprio.
E' parso strano anche a me, appeno ho letto il codice, ma lo ha fatto cosi'.

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: getc() segmentation fault

Messaggio da Mario Vanoni »

robbybby ha scritto:
Mario Vanoni ha scritto: v[MAX]
ma dove posizioni lo \0 finale?

v[MAX + 1];
Mario, v e' usato come un array di stringhe, non come una stringa in se' (o puntatore a caratteri che dir si voglia).
v e' un puntatore a puntatori a caratteri (char **) e non un puntatore a caratteri (char*). Infatti e' dichiarato come

Codice: Seleziona tutto

char *v[MAX]
, e non come

Codice: Seleziona tutto

char v[MAX+1]
.
Lui, dentro ogni elemento, ci mette una stringa intera, con gia' il suo NULL terminator, quindi l'ultimo elemento non lo usa proprio.
E' parso strano anche a me, appeno ho letto il codice, ma lo ha fatto cosi'.
Scusa Roberto, deformazione mentale di vecchia data.

Come detto in un post precedente,
metto sempre una sentinella,
non si sa mai ...

Avatar utente
robbybby
Linux 4.x
Linux 4.x
Messaggi: 1223
Iscritto il: sab 16 dic 2006, 10:48
Slackware: 13.1 / 64 bit
Kernel: 3.3.x
Desktop: KDE 4.4.5
Località: Fra Trantor e Terminus

Re: getc() segmentation fault

Messaggio da robbybby »

@Mario: la sentinella la metto sempre anch'io, e inizializzo sempre tutto. E spargo il codice di assert(): mi hanno salvato un sacco di volte.

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: getc() segmentation fault

Messaggio da anycolouryoulike »

robbybby ha scritto:Lui, dentro ogni elemento, ci mette una stringa intera, con gia' il suo NULL terminator, quindi l'ultimo elemento non lo usa proprio.
E' parso strano anche a me, appeno ho letto il codice, ma lo ha fatto cosi'.
Se c'è un metodo migliore son ben lieto di conoscerlo!
Come ho già detto, non sono per niente esperto di C, e per me ogni consiglio è prezioso.

Avatar utente
robbybby
Linux 4.x
Linux 4.x
Messaggi: 1223
Iscritto il: sab 16 dic 2006, 10:48
Slackware: 13.1 / 64 bit
Kernel: 3.3.x
Desktop: KDE 4.4.5
Località: Fra Trantor e Terminus

Re: getc() segmentation fault

Messaggio da robbybby »

Ho riletto meglio il tuo codice.
La scelta di utilizzare un array di puntatori a stringhe e' piu' che lecita.
E' il resto della struttura del programma che, non va.
Prima di tutto evita tutti quei break e continue. Rendono il programma difficilmente leggibile, oltre che a terzi, anche a te, se lo riprendi in mano fra qualche mese. Inoltre lo rendono anche difficilemte manutenibile. Tieni presente che, nel mondo reale, un programma e' soggetto a continue modifiche, per variazioni di specifichem o ampliamenti. Se ti abitui subito a scrivere programma facilemente manutenibili, ne hai solo guadagno. Inoltre devono essere leggibili anche da altri, perche' a un certo programma ci si lavora in piu' persone.

Riorganizza il programma senza continue e break, e che la programmazione strutturata sia con te.

Ah, devi anche mettere un controllo sulla quantita' di caratteri letti, altrimenti s puo' andare in overflow, con risultati imprevedibili (o, meglio, facilmente prevedibili).

Rispondi