Forum Programmation.c Problème pour l'affichage du contenu de plusieurs répertoires

Posté par  .
Étiquettes : aucune
0
27
sept.
2008
Salut à tous !!

Je dois faire un petit programme qui affiche les éléments d'un dossier en C (comme ls).
Le problème c'est que le premier répertoire s'affiche bien.

Mais après j'ai un
*** glibc detected *** tri: corrupted double-linked list: 0x0804c140 ***

Je pense qu'il y a un soucis au niveau de mon free()

Le voici : http://pastebin.com/m30d082ce

Merci de m'éclairer sur mon problème, car c'est embêtant de pas trouver où est l'erreur.
  • # C'est un exercice?

    Posté par  . Évalué à 3.

    ...parce que si c'est le cas, vaudrait mieux en discuter avec tes profs, ils seront plus à même de répondre par des commentaire qui t'aideront, plutôt qu'un résultat qui ne t'apprend rien.

    Sinon, un indice:
    - tu as bien un problème de free, mais il ne plante pas le programme, donc ne pas s'en inquiter pour le moment;
    - ton problème est dans le malloc, comme d'habitude.

    Puis quelques remarques:
    - un certain nombre de tes commentaires sont totalement inutiles, alors qu'il y aurait moyen d'y mettre une information;
    - mais essayer de commenter c'est tout de même une bonne chose, essaie juste de réfléchir à ce que tu veux mettre. C'est dur au départ, mais si tu fait l'effort, tu y gagnera vite par la suite;
    - très bon réflexe de mettre des commentaire devant chaque fonction, essaie de ne jamais perdre cette habitude;
    - pourquoi une variable arguments et une autre tE ? entre un nom explicite qui est en fait faux, et un nom crypté, heu...

    Voila, pardon pour mes remarques un peu complexes/dures, mais je suis parti du principe que tu voulais apprendre, donc j'essaie de te faire avancer plutôt que de pondre un résultat tout prêt qui au final ne t'aidera pas. Mais si tu veux juste un truc qui marche, dis-le.
    • [^] # Re: C'est un exercice?

      Posté par  (site web personnel) . Évalué à 2.

      regarder le code source de ls peut aider aussi :D

      le trouver est laissé à titre d'exercice :p
    • [^] # Re: C'est un exercice?

      Posté par  . Évalué à 1.

      En effet, c'est bien un exercice, mais le pb c'est que je dois le rendre lundi (comme d'habitude quoi !)

      Alors, je crois simplement avoir fait un free(tE) et tout mon appli remarche !!
      Par contre, j'aimerais savoir pourquoi tu penses qu'il y a un pb au niveau du malloc (j'en fait 2 à cause du readdir) ?

      Sinon, mon programme a parfois un comportement étrange par exemple sur /usr/bin :

      xfce4-screenshooter
      xfce4-session
      xfce4-session-logout
      xfce4-taskmanager
      xfce4-tips
      xfce4-volstatus-icon
      Il y a des caractères spéciaux sur certains éléments, et je ne comprends pas pourquoi :( Serait-ce le malloc ?

      Merci pour tes conseils/commentaires, je vais m'en occuper
      • [^] # Re: C'est un exercice?

        Posté par  . Évalué à 3.

        Je ne pense pas qu'il y a un problème sur le malloc, j'en suis sûr: c'est l'expérience qui fait que l'on fini par voir rapidement ce genre d'erreurs sur de petits programmes...

        Pour ton problème de caractères bizarres, je te confirmes aussi que c'est le même problème, ton changement sur le free a juste masqué l'un des symptomes.

        Pour te donner un indice supplémentaire, je t'invites à regarder le man de strcpy, en particulier la remarque entre parenthèses dans le premier paragraphe.
        • [^] # Re: C'est un exercice?

          Posté par  . Évalué à 1.

          Ah ok, erreur très bête.
          Il s'agit d'un malloc (strlen (repertoire->d_name)+1);

          Je n'avais absolument pas pensé à ce problème.
          Merci beaucoup, tu m'as fait gagner beaucoup de temps, car j'étais très loin de localiser le problème ici.

          En effet, c'est avec l'expérience que l'on remarque cela.
          • [^] # Re: C'est un exercice?

            Posté par  (site web personnel) . Évalué à 1.

            Hum, plus exactement ça devrait être :
            malloc ((strlen (repertoire->d_name)+1) * sizeof(char));

            Sinon je vois pas vraiment ce que tu alloues...

            Enfin ça peut, peut-être marcher, mais si tu alloue une chaîne tu as intérêt a prendre en compte la taille du type de base...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.