[C] Erreur de segmentation

Fermé
Street - 30 mai 2006 à 20:32
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 31 mai 2006 à 04:09
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 :
Program received signal SIGSEGV, Segmentation fault.
0xb7e52c20 in strcpy () from /lib/tls/i686/cmov/libc.so.6

Quel est le problème ?

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#include "verifIP.h"
#include "parsing.h"

#define F "fichier"

void purge(FILE *fp)
{
  int c;
  while ((c = fgetc(fp)) != '\n' && c != EOF)
    {
    }
}

void clean (char *s, FILE *fp)
{
  /* search ... */
  char *p = strchr (s, '\n');
  if (p != NULL)
    {
      /* ... and kill */
      *p = 0;
    }
  else
    {
      purge (fp);
    }
}

char **parsing(FILE *fp)
{
  char **tab;
  int nb = 0 ,size = 5;
  
  tab = malloc (size * sizeof * tab);
  if(tab == NULL)
    {
      perror("erreur allocation\n");
      exit(1);
    }
  
  if (fp != NULL)
    {
      char line[BUFSIZ];
      
      while(fgets(line, sizeof line, fp) != NULL)
	{
	  clean(line, fp);
	  char *p = strtok(line," ");
	  if (p != NULL)
	    {
	      p = strtok(NULL," ");
	      if (p != NULL)
		{ 
		  if(nb == size)
		    {
		      size += 16;
		      
		      tab = realloc(tab, size * sizeof *tab);
		      if (tab == NULL)
			{
			  perror("erreur allocation\n");
			  free(tab); tab = NULL;
			  return tab;
			}
		    }
		  int ip[4];
		  int n = sscanf(p,"%d.%d.%d.%d",ip,ip+1,ip+2,ip+3);
		  if(n == 4)
		    {
		      tab[nb] = malloc((strlen(p)+1) * sizeof * tab[nb]);
		      if (tab[nb] == NULL)
			{
			  perror("erreur allocation\n");
			  free(tab); tab = NULL;
			  return tab;
			}
		      if(!correctIP(p))
			{
			  strcpy(tab[nb],p);
			  nb++;
			}
		    }
		}
	      
	      else
		{
		  printf ("format error\n");
		  break;
		}
	    }
	  else
	    {
	      printf ("format error\n");
	      break;
	    }
	}
      fclose (fp), fp = NULL;
      tab[nb] = NULL;
    }
  else
    {
      perror (F);
    }
  assert (fp == NULL);
  return tab;  
}

5 réponses

arth Messages postés 9374 Date d'inscription mardi 27 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2016 1 291
30 mai 2006 à 21:58
euh p est un pointeur à mon avis le probleme vient de la.
0
Salut,

que proposes-tu de faire ?

Il me semble qu'il y a aussi des problèmes au niveau de mes mallocs, comment les corriger?

Merci
0
ollie314 Messages postés 145 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 26 octobre 2007 80
30 mai 2006 à 23:04
Bonjour,

Bon, il y a effectivement un petit problème dans tes allocations.

malloc renvoi un pointeur générique (non typé)
void *malloc(size_t size)
il faut impérativement casté le pointeur de retour !!!

ce qui donne

tab = (char *)malloc(sizeof(char));
et ça devrait fonctionner.

Fais attention, cette définition sous entends que tu réaloues un emplacement mémoire à chaque fois que tu ajoutes un élément dans ton tableau.


Remarque : je ne sais pas ce que c'est que cette allocation :
tab = malloc (size * sizeof * tab);
j'aimerais savoir à quoi sert le size. (tu le déclare dans toutes tes allocations).
Remarque 2 : tres réallocations poseront problème. Pour être ludique je t'invite à aller voir les définitions dans les fichiers d'en tête que tu utilises (les prototypes des fonctions sont dans stdlib.h tu en a aussi dans alloca à voir selon le compilateur utilisé ...)

Bon courage !!
Recontacte si tu buches !

Amicalement

Ollie314

Regarde ce petit tutos exellent :
https://en.wikipedia.org/wiki/Malloc
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
31 mai 2006 à 04:02
Vérifie aussi la priorité de tes opérateurs:
while ((c = fgetc(fp)) != '\n' && c != EOF)

Je ne sais trop ce que ça donne, ya moyen de s'emmêler les pinceaux avec tous ces opérateurs...

=>cop en bas de la page
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
31 mai 2006 à 04:09
En fait en vérifiant pour les opérateurs, je crois que c'est bon.
C'était donc un message inutile :-~
0