[C] Erreur de segmentation
Street
-
kilian Messages postés 8854 Statut Modérateur -
kilian Messages postés 8854 Statut Modérateur -
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 :
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
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;
}
A voir également:
- [C] Erreur de segmentation
- Erreur 0x80070643 - Accueil - Windows
- Erreur de lecture reconnecté en 3s - Forum TV & Vidéo
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Erreur 4101 france tv - Forum Lecteurs et supports vidéo
- Erreur 4201 france tv ✓ - Forum Réseaux sociaux
5 réponses
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
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
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
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
Vérifie aussi la priorité de tes opérateurs:
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question