Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
"Segmentation fault" sur un tout petit programme C
Envoyé par: deb

Bonjour,

je m'entraine au langage C, par exemple je viens
de mettre en oeuvre ce simple programme (essai.c) :

>#include <stdio.h>
>#define STR_LEN 180
>int main (int argc, char *argv[])
>{
> char *file,*str ;
> FILE *fd ;
> file=argv[1] ;
> fd=fopen(file,"r") ;
> while ( ! feof(fd) ) {
> fgets(str,STR_LEN,fd) ;
> fputs(str,stdout) ;
> }
> fclose(fd) ;
> return 0 ;
>}

ce programme lit simplement ligne par ligne le fichier
donne en 1er argument, et le restitue aussi ligne par ligne
sur la sortie standard, rien d'extraordinaire me diriez-vous ! sauf peut etre la "segmentation fault" que j'obtiens en
fin d'execution :

la compilation ( gcc -Wall essai.c ) se passe sans pb,
mais l'execution ( par exemple ./a.out essai.c ) donne :

>#include <stdio.h>
>#define STR_LEN 180
>int main (int argc, char *argv[])
>{
> char *file,*str ;
> FILE *fd ;
> file=argv[1] ;
> fd=fopen(file,"r") ;
> while ( ! feof(fd) ) {
> fgets(str,STR_LEN,fd) ;
> fputs(str,stdout) ;
> }
> fclose(fd) ;
> return 0 ;
>}
>}
> 932: symbol=fclose; lookup in file=./a.out
> 932: symbol=fclose; lookup in >file=/lib/libc.so.6
> 932: symbol=fclose; lookup in file=./a.out
> 932: symbol=fclose; lookup in >file=/lib/libc.so.6
>lookup 0x08048000 0x000001ec -> 0x4001f000 0x0005f470 /1 >fclose
> 932: symbol=free; lookup in file=./a.out
> 932: symbol=free; lookup in file=/lib/libc.so.6
>Segmentation fault

Le programme restitue bien le fichierr essai.c mais
il lit deux fois la derniere ligne ( pourquoi ? )
et surtout il fait une "Segmentation fault" a la fin
d'ou je ne vois qu'elle puisse venir.

Les lignes de debugage 932... n'apparaissent pas tout le
temps, cela depend du fichier lu ! par contre la seg fault
est toujours au rendez-vous.

J'ai essaye de compiler le programme avec des options
de debugage mais cela n'eclaire pas plus le pb,
je m'en remets a vos yeux plus experts que les miens

En vous remerciant pour votre aide

Amicalement
Deb

Poste le Monday 6 June 2005 11:23:42
Répondre     Citer    
Re: "Segmentation fault" sur un tout petit programme C
Envoyé par: mute

"char *file,*str;"
aucun espace n'est alloué pour recevoir le texte que tu lis c'est un coup de bol si ça ne plante pas dès le début

avec "char str[STR_LEN]; ça marchera un peu mieux

Poste le Monday 6 June 2005 13:41:08
Répondre     Citer    
Re: "Segmentation fault" sur un tout petit programme C
Envoyé par: Sve@r

Gaffe aussi parce que "feof" ne fait pas ce que tu sembles croire que ça fait !!!

Apparemment, d'après ton programme, tu sembles croire que "feof" détecte la fin de fichier avant la lecture. Or il n'en est rien. feof t'indique, après que la fin de fichier ait été atteinte (donc après qu'il y ait eu une lecture de trop), si tu es arrivé en fin de fichier. Cela sert surtout quand on veut lire un fichier en plusieurs étapes.

Quand on veut faire une simple lecture, on teste si la fonction "fgets" renvoie NULL. Ca suffit amplement

while(fgets(str,STR_LEN,fd) != NULL)
fputs(str,stdout);

Et voilà

Poste le Monday 6 June 2005 13:50:30
Répondre     Citer    
Re: "Segmentation fault" sur un tout petit programme C
Envoyé par: dby

et si tu veux continuer en déclarant des pointeurs :

char* str = (char*) malloc(sizeof(char) * STR_LEN);
...
...
free(str);

Poste le Monday 6 June 2005 14:43:31
Répondre     Citer    
Re: "Segmentation fault" sur un tout petit programme C
Envoyé par: Sve@r

Citation
dby
et si tu veux continuer en déclarant des pointeurs
:

char* str = (char*) malloc(sizeof(char) *
STR_LEN);
...
...
free(str);

Oui mais faire une allocation dynamique sur une taille connue à l'avance c'est ptet pas franchement optimum...

Poste le Monday 6 June 2005 17:53:08
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
"Segmentation fault" sur un tout petit programme C
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons