Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
729 connectés 

  FORUM HardWare.fr
  Programmation
  C

  seg fault avant la 1ere ligne du main !!??

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

seg fault avant la 1ere ligne du main !!??

n°907333
ACYT
Posté le 25-11-2004 à 00:43:07  profilanswer
 

voilà, je suis entrain de recoder la commande Unix "pwd" en C, avec des opendir, des readdir et une petite pile FILO maison, et, comme je débute en C, je ne comprend pas trop pourquoi j'ai un seg fault au lancement du prog, alors que je n'ai aucune erreur à la compile.
 
j'ai mis un printf à la premiere ligne de mon main et il ne me l'affiche pas.
 
est ce qu'il parcourt les autres fonctions avant mon main et qu'il seg fault à cause d'une d'entre elles?
 
comment savoir où se situe le problème?

mood
Publicité
Posté le 25-11-2004 à 00:43:07  profilanswer
 

n°907339
Taz
bisounours-codeur
Posté le 25-11-2004 à 00:49:43  profilanswer
 

gcc -ggdb machin.c
gdb ./a.out
> run
> bt

n°907346
ACYT
Posté le 25-11-2004 à 00:59:24  profilanswer
 

connaissais pas!
 
merci pour ce conseil plus qu'utile!

n°907366
ACYT
Posté le 25-11-2004 à 01:22:57  profilanswer
 

euh, je suppose que quand le debugger m'indique une erreur dans strlen, je suppose obligatoirement que c'est un problème par rapport à ce que je lui passe en paramètre?
 
pourtant :
 
 
strlen(stack->doss);
 
avec
typedef struct s_stack
{
 char * doss;
 struct s_stack *next;
} t_stack
 
et
t_stack *stack;

n°907375
manatane
En vous remerciant, bonsoir
Posté le 25-11-2004 à 01:35:28  profilanswer
 

Tu n'aurais pas bouffer le caractère nul dans la chaine que tu lui passe en paramètre?
strlen va parcourir toute la zone mémoire à la recherche d'un 0, en déborder -> SIGSEGV
Utilise strnlen


Message édité par manatane le 25-11-2004 à 01:37:44
n°907377
ACYT
Posté le 25-11-2004 à 01:52:08  profilanswer
 

merci pour ton aide
 
en fait j'ai fait un malloc pour mon char * doss en prenant bien strlen de ma chaine de caractère + 1 (pour le \0)
 
je pense pas que ça vienne de là finalement...
maintenant il me parle d'une erreur sur strcpy (!) donc je regarde ça...
 
 
 
pffff, quelle idée de partir en école d'info :sarcastic:

n°907378
ACYT
Posté le 25-11-2004 à 02:00:20  profilanswer
 

bon, j'ai testé autre chose et il me trouve tjs une erreur :
 

Code :
  1. int cpt=0;
  2. cpt=strlen(stack->doss);


 
et j'ai toujours une erreur sur ma ligne du strlen :'(
 
ça peut pas etre un problème avec la forme de stack->doss ?
 
je comprend plus rien là :'(

n°907380
ACYT
Posté le 25-11-2004 à 02:04:12  profilanswer
 

résolu!
 
j'ai rajouter un
 

Code :
  1. if (stack->doss)


 
l'erreur était gérée differement avant mais comme ça marche, enfin, maintenant il me trouve d'autres erreurs :sarcastic:


Message édité par ACYT le 25-11-2004 à 02:04:45
n°907413
darkoli
Le Petit Dinosaure Bleu
Posté le 25-11-2004 à 09:04:29  profilanswer
 

ACYT > si ton code n'est pas trop gros tu peux toujours le poster.


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
n°907437
Taz
bisounours-codeur
Posté le 25-11-2004 à 09:39:50  profilanswer
 

euh tu l'alloues comment stack ?

mood
Publicité
Posté le 25-11-2004 à 09:39:50  profilanswer
 

n°907607
ACYT
Posté le 25-11-2004 à 13:13:23  profilanswer
 

je pense effectivement que le plus simple pour que vous puissiez comprendre serait de poster le code mais je suis sûr que vous allez trouver plein plein de chose pas bien dedans :whistle:
 
il fait environ 110 lignes, c'est trop?

n°907637
ACYT
Posté le 25-11-2004 à 13:53:54  profilanswer
 

bon ben, voilà le code : (je suis ouvert à toute critique qui me permettrait de mieux coder!!)
 
désolé je n'ai pas encore commenté le code par contre  
 

Code :
  1. #include <dirent.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. typedef struct s_stack
  7. {
  8.   char *doss;
  9.   struct s_stack *next;
  10. } t_stack;
  11. t_stack * create_stack ()
  12. {
  13. t_stack *stack;
  14. stack = 0;
  15. return stack;
  16. }
  17. t_stack * push(t_stack *stack, char * data)
  18. {
  19. t_stack * elt;
  20. elt = malloc(sizeof(t_stack));
  21. elt->doss = malloc((strlen(data)+1)*sizeof(char));
  22. strcpy(elt->doss, data);
  23. elt->next=stack;
  24. stack=elt;
  25. // printf("j'ai bien pushé\n" );
  26. return (stack);
  27. }
  28. t_stack * pop(t_stack *stack)
  29. {if (stack != 0)
  30. {
  31. // printf("je pop" );
  32. char * tmp;
  33. int cpt=0;
  34. if (stack->doss)
  35. cpt=strlen(stack->doss);
  36. tmp = malloc((cpt+1)*sizeof(char));
  37. t_stack *tmp_free;
  38. if(stack->doss)
  39. tmp = strcpy(tmp , stack->doss);
  40. tmp_free = stack;
  41. stack=(stack->next);
  42. free(tmp_free);
  43. // printf("j'ai bien popé" );
  44. printf("/%s",tmp);
  45. free(tmp);
  46. return(stack);
  47. }
  48. return stack;
  49. }
  50. void aff(t_stack *stack)
  51. {
  52. while(stack != 0)
  53. {
  54. //  printf(" %d ",stack);
  55.   stack = pop(stack);
  56. //  printf(" %d ",stack);
  57.   if (stack==0);
  58. printf(" stack est deja à 0 " );
  59. }
  60. }
  61.  
  62. t_stack * pwd(int ino, t_stack *stack)
  63. {
  64.   struct dirent *s_dir;
  65.   DIR *dir;
  66.   chdir(".." );
  67.   s_dir = readdir(opendir("." ));
  68.   if (s_dir->d_ino != (readdir(opendir(".." )))->d_ino)
  69. pwd(s_dir->d_ino, stack);
  70.   dir = opendir("." );
  71.   while ((s_dir = readdir(dir)) && (s_dir->d_ino !=(unsigned)ino || *(s_dir->d_name) == '.'))
  72. ;
  73.   if (s_dir)
  74.   {
  75. stack= push(stack, s_dir->d_name);
  76. if(chdir(s_dir->d_name) < 0)
  77.  exit(1);
  78.   }
  79.   else
  80. printf("/" );
  81. return (stack);
  82. }
  83. int main ()
  84. {
  85.   t_stack *stack;
  86.   stack = create_stack();
  87.   stack = pwd(readdir(opendir("." ))->d_ino, stack);
  88. //  printf("donc je passe par là " );
  89.   aff(stack);
  90.   printf("\n" );
  91.   return (0);
  92. }


 
il y a quelques printf par ci par là qui m'ont permis de localiser l'erreur...

n°907656
ACYT
Posté le 25-11-2004 à 14:12:27  profilanswer
 

ok problème résolu
j'avais juste oublié de récupérer stack à la ligne 83  :whistle:
 
 
 
me reste plus qu'à afficher le résultat dans le bon ordre

n°907660
Taz
bisounours-codeur
Posté le 25-11-2004 à 14:13:35  profilanswer
 

c'est une blague ton create_stack ?

n°907683
ACYT
Posté le 25-11-2004 à 14:24:03  profilanswer
 

euh.... oui?
après reflexion c'est sûr qu'elle sert à rien mais en fait au début j'étais parti sur une liste chaînée et j'initialisais beaucoup plus de chose dans cette fonction...
 
par contre je dois vraiment avoir fait une pile de merde pour qu'elle arrive à me ressortir les valeurs dans le mauvais sens :pfff:

n°907694
Taz
bisounours-codeur
Posté le 25-11-2004 à 14:27:32  profilanswer
 

et puis, c'est NULL et pas 0

n°907704
ACYT
Posté le 25-11-2004 à 14:35:43  profilanswer
 

un doute me prend : pourquoi si je rajoute un printf("/%s", s_dir->d_name);  
 
avant la ligne 89, il m'affiche directement le resultat sans passer par ma pile??
 
j'ai fait tout ça pour rien??
 
:'(


Message édité par ACYT le 25-11-2004 à 14:36:40
n°907706
Lam's
Profil: bas.
Posté le 25-11-2004 à 14:37:14  profilanswer
 

ACYT a écrit :

j'ai fait tout ça pour rien??


Tu veux dire que tu aurais pu utiliser getcwd ?  
   http://man.he.net/man3/getcwd
 
edit: en plus, je crois que ton truc ne marche pas si le nom d'un de tes répertoires commence par un '.'


Message édité par Lam's le 25-11-2004 à 14:38:09
n°907720
ACYT
Posté le 25-11-2004 à 14:48:53  profilanswer
 

bon ben voilà, je viens de supprimer ma pile et tout fonctionne avec juste un petit printf bien placé
 
j'ai la rage, j'ai bossé jusqu'à 3h30 pour ça ce matin
 
voilà le code final :
 
edit : en fait je le remettrai quand le projet sera rendu, pas envie que des petits malins le pompe entre temps
 
 
en tout cas merci à tous pour votre aide!
 
:hello:


Message édité par ACYT le 25-11-2004 à 16:38:16
n°913377
Emmanuel D​elahaye
C is a sharp tool
Posté le 02-12-2004 à 23:30:27  profilanswer
 

ACYT a écrit :

bon ben, voilà le code :  


Voici une version simplifiée et corrigée:  

Code :
  1. /* -ed-
  2. * Commentaires C90
  3. * suppression accents
  4. * Re-indentation
  5. * Suppression du code non portable
  6. * Test du mecanisme de stack.
  7. * Mise au point des liberation manquantes.
  8. */
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. typedef struct s_stack
  13. {
  14.    char *doss;
  15.    struct s_stack *next;
  16. }
  17. t_stack;
  18. t_stack *push (t_stack * stack, char *data)
  19. {
  20.    t_stack *elt = malloc (sizeof (t_stack));
  21.    if (elt != NULL)
  22.    {
  23.       elt->doss = malloc (strlen (data) + 1);
  24.       strcpy (elt->doss, data);
  25.       elt->next = stack;
  26.       stack = elt;
  27.    }
  28.    return stack;
  29. }
  30. t_stack *pop (t_stack * stack)
  31. {
  32.    if (stack != NULL)
  33.    {
  34.       if (stack->doss)
  35.       {
  36.          printf ("/%s\n", stack->doss);
  37.       }
  38.       {
  39.          t_stack *tmp_free = stack;
  40.          stack = stack->next;
  41.          free (tmp_free->doss);
  42.          free (tmp_free);
  43.       }
  44.    }
  45.    return stack;
  46. }
  47. void aff (t_stack * stack)
  48. {
  49.    while (stack != NULL)
  50.    {
  51.       stack = pop (stack);
  52.       if (stack == NULL)
  53.       {
  54.          printf (" stack est deja a 0\n" );
  55.       }
  56.    }
  57. }
  58. int main (void)
  59. {
  60.    t_stack *stack = NULL;
  61.    stack = push (stack, "1" );
  62.    stack = push (stack, "2" );
  63.    stack = push (stack, "3" );
  64.    aff (stack);
  65.    return 0;
  66. }


Message édité par Emmanuel Delahaye le 03-12-2004 à 08:22:55

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  seg fault avant la 1ere ligne du main !!??

 

Sujets relatifs
Afficher tableau en ligne...... explications inside !comment se connecter à une BD de free en ligne de commande
Supprimer une ligne d'une table MySQL[C++] Désactiver le retour à la ligne automatique...
debutant : comment aller a la ligne dans une chaîne[HTML] Décallage d'une image par rapport à la ligne courante
[HTML]pas de retour a la ligneRetours a la ligne
[C++] Bibliothèque Argstream : arguments de la ligne de commandeajout ligne dansun fichier texte
Plus de sujets relatifs à : seg fault avant la 1ere ligne du main !!??


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR