> Bonjour la liste,
> Durant mes heures de loisirs ces jours-ci, je fais systématiquement les
> exercices de programmation en C de Linux mag (à titre de divertissement
> :-) comme d'autres font des jeux vidéo re :-) )
> Mais après compilation et éventuel déboggage (fautes de frappe) quand je
> lance ces programmes j'ai tout aussi systématiquement le message :
> erreur de segmentation
>
> Qu'est-ce que cela signifie ?
> Comment diagnostiquer l'erreur et la corriger ?

Bonjour
je ne pense pas que tu sois sur la bonne liste pour poser ce genre de
questions, oriente toi plutot vers des foriis (je trouvais que ca sonnait
bien au pluriel comme ca) plutot oriente prog et plus particulierement C.

Sinon pour repondre brievement a ton probleme, grosso merdo c est que tu
essayes d'ecrire/d'acceder a une zone memoire dont tu n;as pas le droit.
Ce genre de prob est tres souvent du a une boucle qui ... boucle trop loin.
ou alors tu as un char* ou un int* qui n'est pas malloqué (man malloc).
En fait il y a plein plein de manieres differentes de faire un seg fault et
sans le code on peut pas deviner :)

Pour "debugger" et voir ou ton application plante, utilise gdb (man gdb).
Tu dois compiler avec l'option -g2 (par exemple)
Je te conseille egalement de compiler avec l'option -Wall (man gcc) qui te
permet d'etre plus "strict" dans ta compilation et afficher des warnings
bien utiles qui tu ne verrais pas sinon
ex :
gcc -Wall -g2 main.c

ensuite tu utilises gdb pour "debugger" ton programme. (re man gdb)
ca te fait un truc du genre (apres compilation) :

> gdb a.out
[blablablabla]
(gdb) run
[blablablalbal]
segmentaion fault
(gdb) where
#0  0x480d7cf6 in vfprintf () from /usr/lib/libc.so.12
#1  0x480c6650 in printf () from /usr/lib/libc.so.12
#2  0x8048928 in main () at toto.c:8
#3  0x8048710 in ___start ()
(gdb)

et la gdb te dit par ou est passe ton programme avant de planter. (dans ce
cas on voit que c est printf qui a plante ... mais attention ca veut pas
dire que c est printf qui fait planter le programme mais que tu passes
n'importe quoi a printf)

Heu je vois pas quoi te dire d'autres si ce n'est que ce que j ai dit n'est
pas tres clair ....
En gros tu as beaucoup de man a ingurgiter :
man gcc
man gdb
man malloc
man free (a chaque malloc doit correspondre un free!!!)

sinon tu peux egalement essayer de retrouver la ou ton prog plante a l'aide
de printf
tu mets des printf "intelligeamment"  dans ton code en essayant d'entourer
la partie du code incriminé mais c'est moins efficace que gdb.

Bonne chance dans ton apprentissage du C ! :)

Manu



Vous souhaitez acquerir votre Pack ou des Services MandrakeSoft?
Rendez-vous sur "http://www.mandrakestore.com";

Répondre à