FORUM Tom's Hardware » Programmation » C / C++ / Java » [ C] Erreur de segmentation
 

[ C] Erreur de segmentation

Il y a 286 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici
Ajouter une réponse



 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : [ C] Erreur de segmentation
 
Plus d'informations

Bonjour,
 
Je compile mon programme en faisant un make
lorsque j'execute mon programme, j'obtiens une erreur de segmentation
Avec gdb, j'obtiens ceci :

Code :
  1. Program received signal SIGSEGV, Segmentation fault.
  2. 0xb7e52c20 in strcpy () from /lib/tls/i686/cmov/libc.so.6


Quel est le problème ?
Pourriez-vous m'aider à le corriger ?
 
Merci par avance
 
VerifIP, vérifies si une IP est correcte avant de la mettre dans le tableau
 
le seul fichier code ou j'utilise strcpy est celui-ci

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <assert.h>
  5. #include "verifIP.h"
  6. #include "parsing.h"
  7. #define F "fichier"
  8. void purge(FILE *fp)
  9. {
  10.   int c;
  11.   while ((c = fgetc(fp)) != '\n' && c != EOF)
  12.     {
  13.     }
  14. }
  15. void clean (char *s, FILE *fp)
  16. {
  17.   char *p = strchr (s, '\n');
  18.   if (p != NULL)
  19.     {
  20.       *p = 0;
  21.     }
  22.   else
  23.     {
  24.       purge (fp);
  25.     }
  26. }
  27. char **parsing(FILE *fp)
  28. {
  29.   char **tab;
  30.   int nb = 0 ,size = 5;
  31.  
  32.   tab = malloc (size * sizeof * tab);
  33.   if(tab == NULL)
  34.     {
  35.       perror("erreur allocation\n" );
  36.       exit(1);
  37.     }
  38.  
  39.   if (fp != NULL)
  40.     {
  41.       char line[BUFSIZ];
  42.      
  43.       while(fgets(line, sizeof line, fp) != NULL)
  44.     {
  45.       clean(line, fp);
  46.       char *p = strtok(line," " );
  47.       if (p != NULL)
  48.         {
  49.           p = strtok(NULL," " );
  50.           if (p != NULL)
  51.         {
  52.           if(nb == size)
  53.             {
  54.               size += 16;
  55.              
  56.               tab = realloc(tab, size * sizeof *tab);
  57.               if (tab == NULL)
  58.             {
  59.               perror("erreur allocation\n" );
  60.               free(tab); tab = NULL;
  61.               return tab;
  62.             }
  63.             }
  64.           int ip[4];
  65.           int n = sscanf(p,"%d.%d.%d.%d",ip,ip+1,ip+2,ip+3);
  66.           if(n == 4)
  67.             {
  68.               tab[nb] = malloc((strlen(p)+1) * sizeof * tab[nb]);
  69.               if (tab[nb] == NULL)
  70.             {
  71.               perror("erreur allocation\n" );
  72.               free(tab); tab = NULL;
  73.               return tab;
  74.             }
  75.               if(!correctIP(p))
  76.             {
  77. [b]              strcpy(tab[nb],p);[/b]
  78.               nb++;
  79.             }
  80.             }
  81.         }
  82.          
  83.           else
  84.         {
  85.           printf ("format error\n" );
  86.           break;
  87.         }
  88.         }
  89.       else
  90.         {
  91.           printf ("format error\n" );
  92.           break;
  93.         }
  94.     }
  95.       fclose (fp), fp = NULL;
  96.       tab[nb] = NULL;
  97.     }
  98.   else
  99.     {
  100.       perror (F);
  101.     }
  102.   assert (fp == NULL);
  103.   return tab; 
  104. }

Profil : Pointeur
Plus d'informations

question stupide : tu peux pas le faire en C++ ?


---------------
Da Bidz Triad©®™: Bidz Interceptor
.:: Smileyz version 4.2 [050625]::. -- Code source disponible sous licence GPL.
[u
Profil : Pointeur
Plus d'informations

autre remarque
pourquoi tu utilises un malloc alors que tu connais la taille a l'avance ?
utilise directement un tableau :spamafote:


---------------
Da Bidz Triad©®™: Bidz Interceptor
.:: Smileyz version 4.2 [050625]::. -- Code source disponible sous licence GPL.
[u
Profil : Pointeur
Plus d'informations

ha non, désolé, j'avais pas vu que tu faisait un realloc ...


---------------
Da Bidz Triad©®™: Bidz Interceptor
.:: Smileyz version 4.2 [050625]::. -- Code source disponible sous licence GPL.
[u
Plus d'informations

Salut,
 
je ne connais que le C.
J'ai l'impresssion que le problème vient de mes malloc sont-ils bien écrits ?

Profil : Pointeur
Plus d'informations

il serait avantageux que tu apprennes le c++, c'est nettement plus simple pour jouer avec  
1/ la memoire
2/ les chaines de caractères


---------------
Da Bidz Triad©®™: Bidz Interceptor
.:: Smileyz version 4.2 [050625]::. -- Code source disponible sous licence GPL.
[u
zeb
Profil : Modérateur libre
Plus d'informations

KangOl> ??? M'enfin, le gars ne choisi pas forcément son langage !!!
 
Premium> J'ai lu les exemples de sizeof d'Emmanuel ailleurs. Je les trouve peu lisibles. Le problème semble bien venir des mallocs.

Profil : Pointeur
Plus d'informations

a écrit :

??? M'enfin, le gars ne choisi pas forcément son langage !!!

effectivement  [:meske]  


---------------
Da Bidz Triad©®™: Bidz Interceptor
.:: Smileyz version 4.2 [050625]::. -- Code source disponible sous licence GPL.
[u
Plus d'informations

a écrit :

KangOl> ??? M'enfin, le gars ne choisi pas forcément son langage !!!
 
Premium> J'ai lu les exemples de sizeof d'Emmanuel ailleurs. Je les trouve peu lisibles. Le problème semble bien venir des mallocs.


Exact le problème venait des malloc et j'ai réussi à compiler et executer mon programme  :D  
 
Mes malloc ont été inspiré de ce que faisait Emmanuel, en me référant à des écritures plus classiques tel que sizeof(char*)... j'ai résolu mon problème  :D
 
Voici d'ou a été tiré le model de ma 1ère version :
http://www.presence-pc.com/forum/p [...] 3339-1.htm


Message édité par Man_Utd le 31-05-2006 à 19:30:54
Plus d'informations

a écrit :

effectivement  [:meske]


J'apprendrais le C++ l'an prochain.
 
A ce propos. Si quelqu'un a des cours, exos, ... à me conseillez car je vais m'y mettre pendant les vacances pour ne pas être perdu à la rentrée  :D
et aussi des cours ... pour ce qui concerne la programmation graphique en java.
 
Je sais bien que des milliers de cours sont dispo sur le net mais je voudrais si vous avez en stock de bons (ou très bons) cours car il faut bien m'expliquer pour que j'assimile le truc  :pt1cable:


Message édité par Man_Utd le 31-05-2006 à 19:36:34
Plus d'informations

Pour les cours de C++ je te conseil un petit document ecrit par mon prof de fac en C/C++, la il par sur le principe que tu connait deja le C et c'est facile à lire.
http://www.dil.univ-mrs.fr/~garreta/
Voila, je te conseil donc le poly intitulé langage C++

Plus d'informations

Tips:
La plupar du temps quand ca plante dans la libc c'est qu'un pointeur null ou desallouer a ete passe a la libc.
 
il est utile d'utlisiser gdb pour trouver ou est l'erreur:
ex:
 
#>gdb --args monProg -arg1 test  
Program received signal SIGSEGV, Segmentation fault.
///liste le call stack.
gdb:where
///choisir le stack juste avant la libc
gdb:frame 3
 
Ca devrait donner une bonne idee ou se troube le call a la libc fautif.


Aller à :
Ajouter une réponse
  FORUM Tom's Hardware » Programmation » C / C++ / Java » [ C] Erreur de segmentation
 

Annonces Google
Publicité