Rechercher : dans
Par :

[C] Erreur de segmentation

Dernière réponse le 31 mai 2006 à 04:09:14 Street, le 30 mai 2006 à 20:32:18 
 Signaler ce message aux modérateurs

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;  
}

Meilleures réponses pour « [C] Erreur de segmentation » dans :
[Langage C] C/C++ Erreur de segmentation Voir Qu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
La compilation et les modules en C et en C++ VoirCet article a pour vocation d'introduire les notions de bases de la compilation en C et en C++ et de la programmation modulaire. Il permet de mieux comprendre les messages d'erreur du compilateur. Les notions abordées ici sont indépendantes du...
Les constructeurs et les destructeurs en langage C++ VoirLa notion de constructeur Le constructeur est la fonction membre appelée automatiquement lors de la création d'un objet (en statique ou en dynamique). Cette fonction membre est la première fonction membre à être exécutée, il s'agit donc d'une...

1

arth, le 30 mai 2006 à 21:58:26

Euh p est un pointeur à mon avis le probleme vient de la.

Répondre à arth

2

Street, le 30 mai 2006 à 22:02:15

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

Répondre à Street

3

ollie314, le 30 mai 2006 à 23:04:57

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 :
http://en.wikipedia.org/wiki/Malloc

Répondre à ollie314

4

kilian, le 31 mai 2006 à 04:02:17

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

Répondre à kilian

5

 kilian, le 31 mai 2006 à 04:09:14

En fait en vérifiant pour les opérateurs, je crois que c'est bon.
C'était donc un message inutile :-~

Répondre à kilian