[C] Erreur de segmentation
Street
-
kilian Messages postés 8732 Date d'inscription Statut Modérateur Dernière intervention -
kilian Messages postés 8732 Date d'inscription Statut Modérateur Dernière intervention -
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 4201 france tv ✓ - Forum Réseaux sociaux
- J'aime par erreur facebook notification - Forum Facebook
- Code erreur f3500-31 ✓ - Forum Bbox Bouygues
- Comment recuperer whatsapp supprimé par erreur - Guide
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