Segmentation fault aléatoires !! - C - Programmation
Marsh Posté le 23-01-2004 à 02:38:26
len = strlen(racine);
chemin = (char*) malloc((len+1)*sizeof(char));
strcpy(chemin, racine);
chemin[len] = '\0';
=>
chemin = strdup(racine)
rgarderais le reste demain si personne a fait
Marsh Posté le 23-01-2004 à 02:40:41
OK, mais c'est sûr qu'il n'y aura pas de merdes avec ça ?
-> genre avec l'emplacement de '\0' car j'ai lutté aussi pour ça..
Marsh Posté le 23-01-2004 à 03:27:04
Pourquoi les gens qui apprennent à programmer en C n'apprennent jamais à utiliser un debugger ? Tu compiles ton programme en -g, tu le lances, il segfault et tu récupère un dump. Tu lances le debugger et hop, tu vois ou ça plante... Un segfault c'est généralement un des trucs les plus simple à debugger... Avec un debugger.
Marsh Posté le 23-01-2004 à 07:43:42
ReplyMarsh Posté le 23-01-2004 à 11:29:04
Voici un truc pour te simplifier la vie. Utilises Valgrind s'il est dispo pour ta plateforme et essaye aussi efence http://freshmeat.net/projects/efence/?topic_id=47
Marsh Posté le 23-01-2004 à 12:09:49
Code :
|
ton malloc est un caractere trop court:
tmp = (char*) malloc((len+strlen(namelist[i]->d_name)+1)*sizeof(char));
Tu n'as pas la place pour le \0 final de chaine.
Le fait que ca plante pas systematiquement vient probablement du fait que pour des raisons d'alignement memoire, comme tu ne depasses que d'un octet, tu as des chances que l'octet de trop soit dans une zone non allouee pour quelque chose d'autre.
A+,
Marsh Posté le 23-01-2004 à 12:34:34
Et si tu veux optimiser un poil, tu calcules d'abord la taille max de ta variable tmp, et tu fais l'allocation une fois pour toute.
Code :
|
A+,
Marsh Posté le 23-01-2004 à 22:39:20
gilou a écrit :
|
D'où l'intérêt d'utiliser strdup comme il a été signalé plus haut, d'autant que l'opération de sauvegarde dans une chaîne temporaire apparait deux fois dans le code, donnant lieu à des allocations compliquées.
Marsh Posté le 23-01-2004 à 22:58:46
(char*) malloc((len+strlen(namelist[i]->d_name))*sizeof(char));
wow
malloc(len+strlen(namelist[i]->d_name));
suffit amplement
t'as le morceau pour l''\0' ? la mise à 0 n'est pas nécessaire après un strcpy
Marsh Posté le 23-01-2004 à 23:27:14
el muchacho a écrit : |
Oui sauf que non: ca se voit pas dans mon extrait de son code, mais il fait un ajout de chaine au bout de celle dupliquée.
Donc il faut passer par un malloc...
A+,
Marsh Posté le 26-01-2004 à 00:41:09
Merci pour vos remarques.
Dsl mais je n'ai pas pu les consulter plus tôt et je vais
regarder tout ça et vous en dire plus.
Merci à vous.
Marsh Posté le 27-01-2004 à 10:35:18
gilou a écrit : |
Oui, c'est effectivement cela qui me faisait plantait aléatoirement, et aussi l'autre malloc que je faisais où il manquait ausi une case mémoire :
Code :
|
J'ai mis len+2 et c'et OK.
C'était vraiment pas évident du fait qu'il marchait correctement de temps en temp.. Le débuggueur ne m'avait pas aidé et c'est pour ça que j'avais posté.
Merci bien !
Marsh Posté le 27-01-2004 à 19:56:00
Oui, bien entendu mais les profs sont galère avec ça..
Histoire que l'on n'oublie pas!
Marsh Posté le 27-01-2004 à 19:57:39
ben si vous l'oublié, si c'était clair dans vos têtes ...
Marsh Posté le 27-01-2004 à 23:22:25
Ndmax a écrit :
|
Un plantage aleatoire est presque toujours deterministe
A+,
Marsh Posté le 23-01-2004 à 02:33:48
Slt !
Je deviens fou !!
Je fais un petit programme qui répertorie la liste des fichiers
et répertoires à partir d'une racine donnée.
Le problème est qu'il fonctionne avec certaines racines,
et me fait une "segmentation fault" avec d'autres !
Je ne sais plus comment faire.
Normalement je fais des "free()" lorsque je n'ai plus besoin
de pointeurs, mais je me suis aperçu que si j'en faisais ça merdait dans certains cas contrairement à lorsque je n'en fais pas.. Mais juste dans certains cas !!
Pourriez-vous m'éclaircir SVP car je ne vois pas du tout le pb!
Vous voyez, là je mets en commentaire mes "free()".
Merci pour votre aide.