> Tous les forums > Forum Autres langages
 Erreur de segmentationSujet résolu
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
Premium
  Posté le 30/05/2006 @ 18:19 
Aller en bas de la page 
Petit astucien
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]Program received signal SIGSEGV, Segmentation fault. 0xb7e52c20 in strcpy () from /lib/tls/i686/cmov/libc.so.6 [/code] 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 [code] #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)) != '\ ' && c != EOF) { } } void clean (char *s, FILE *fp) { /* search ... */ char *p = strchr (s, '\ '); 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; } [/code]
Publicité
breizhbugs
 Posté le 30/05/2006 à 19:02 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien
Salut, le probleme vient surement de tes allocations du tableau tab qui me semblent assez chaotique.
koala01
 Posté le 30/05/2006 à 19:10 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien
Salut, Typiquement, les erreurs de segmentation sont dues à une tentative d'acces à un espace mémoire non réservé par le système à ton application… Comme tu utilises pointeurs et pointeurs de pointeurs, commence par vérifier la pertinence des éventuelles incrémentations/décrémentations de ceux-ci, et par vérifier la pertinence des acces aux pointeur (de pointeurs) ou aux éléments qui sont visés par eux… La ligne
tab = malloc (size * sizeof * tab);
me parrait dores et déjà bisare, et me semblerait plus mieux si elle était écrite sous la forme de
tab=malloc(size*sizeof(tab));
, sans oublier, ensuite, de vérifier si l'allocation a bien réussi, sous peine, justement d'obternir ton erreur de segmentation… Je n'ai que peu étudié tout ton code, il n'est donc pas impossible qu'il reste d'autres erreurs du meme genre, mais, au moins, maintenant, tu as des idées de directions de recherche [clindoeil]
breizhbugs
 Posté le 30/05/2006 à 19:58 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien
koala01 a écrit : ... La ligne
tab = malloc (size * sizeof * tab);
me parrait dores et déjà bisare, et me semblerait plus mieux si elle était écrite sous la forme de
tab=malloc(size*sizeof(tab));
, sans oublier, ensuite, de vérifier si l'allocation a bien réussi, sous peine, justement d'obternir ton erreur de segmentation… ...
Comme c'est char **tab, la ligne ne deviendrait pas un truc du genre *tab=malloc(size*sizeof(*tab))? enfin moi j'aurai fait un truc dans le genre: typedef char* chaine; chaine *tab; tab = malloc(size*sizeof(chaine)); ... tab[i]=malloc(strlen(adresseip+1)); ensuite pour liberer la memoire il y a 2 imbrications, donc pour chaque tab[i] free(tab[i]); fpour free(tab) Faut voir si ca marcherais comme ca...?
koala01
 Posté le 30/05/2006 à 20:31 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien
D'autre part, je m'étonnes un peu que tu demandes à ta fonction de renvoyer un pointeur de pointeur… "Classiquement" un pointeur de pointeur est fournis en argument à une fonction quand on souhaites qu'elle soit en mesure de modifier un pointeur et de renvoyer une autre valeur… Un petit exemple pour te faire comprendre: dans le code
void MaFonction(char *usage); int AjouteCaractere(char **usage); int main(int argc, char *argv[]) { char tableau[6]; //tableau seul est lui-même un pointeur sur 6 éléments de type char //la fonction recoit un pointeur sur le tableau, et modifie la valeurs de ses éléments MaFonctin(tableau); //Par contre, AjouteCaractere fera passer la taille du tableau à 7 if(AjouteCaractere(&tableau)==1) { //ici, on peu mettre strcpy(tableau,"coucou"); } else { printf("reallocation ratee\n"); } } void MaFonction(char *usage) { strcpy(usage,"hello"); } int AjouteCaractere(char **usage) { //réallocation pour avoir 7 caractere *usage=realloc(7*sizeof(char)); if(*usage!=NULL) return 1; else return 0; }


Modifié par koala01 le 30/05/2006 20:33
Premium
 Posté le 30/05/2006 à 20:47 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
Salut, je passerais donc le char ** en argument de la fonction. J'ai l'impression que le problème vient de cette ligne : [code]tab[nb] = malloc((strlen(p)+1) * sizeof * tab[nb]);[/code] est-ce le cas et comment modifier ?
koala01
 Posté le 30/05/2006 à 20:55 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien
Je suis un imbécile… La réallocation ne peut avoir lieu que quand il s'agit de travailler sur quelque chose qui a été alloué dynamiquement… Il s'agit donc de lire le code de la fonction main sous la forme de
int main(int argc, char *argv[]) { char *tableau; tableau=malloc(6*sizeof(char)); //tableau seul est lui-même un pointeur sur 6 éléments de type char //la fonction recoit un pointeur sur le tableau, et modifie la valeurs de ses éléments MaFonctin(tableau); //Par contre, AjouteCaractere fera passer la taille du tableau à 7 if(AjouteCaractere(&tableau)==1) { //ici, on peu mettre strcpy(tableau,"coucou"); } else { printf("reallocation ratee\n"); } }
Premium
 Posté le 30/05/2006 à 21:28 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
Salut, pour ce qui est de l'écriture des malloc que j'ai fait est ce qu'il te semble correct car j'ai l'impression que mon erreur de segmentation vient de la
koala01
 Posté le 30/05/2006 à 21:33 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien
Pour pouvoir te répondre, il faudrait que l'on sache exactement ce que tu souhaites pouvoir faire… Si le but est d'arriver à une sorte de matrice, (et comme je présumes que tu te dépatouilles toujours avec ton problème d'IP [clindoeil]), il faut voir les choses comme ceci: Il te faut un tableau de pointeurs vers les différentes ip, chaque pointeur pointant vers un tableau de caractères correspondant à une ip… Si nous créons un structure du type de
typedef struct ips { char lip[4] } lesips;
Tu seras en mesure d'écrire un code du genre de
int main(int argc, char *argv[]) { lesips *matrice=NULL; parsing(&matrice);//ici, c'est un pointeur de pointeur [clindoeil] //en sortie de fonction, si elle va jusqu'au bout, on dispose de notre matrice correctement allouée et remplie }
void parsing(FILE *lecteur, lesips **matrice) deviendrait donc quelque chose du genre de
void parsing(lesips **matrice) { //on déclare une variable compteur int cpt=0; //et une variable max qui correspondra au nombre d'ip possible int MAX=10; //déclaration et ouverture du fichier d'entrées FILE *lecteur; lecteur=fopen("tonfichier.txt","rt") //on alloue un nombre par défaut de 10 ip possibles *matrice=malloc(MAX*sizeof(lesips)); //si cela échoue, on n'est pas content if(*matrice==NULL) { //n'oublions pas de fermer le fichier fclose(lecteur); printf("erreur d'allocation\n"); getchar(); exit(1); } //on commence la lecture du fichier while(!Fichier.EOF) { // je passe sur la lecture… tu dois te baser sur *matrice[cpt].lip… //incrémentation du compteur cpt++; //faut peut etre réallouer de l'espace [question] if(cpt++==MAX) { //on rajoute 10 nouveaux éléments MAX+=10; //on réalloue realloc(*matrice,MAX*sizeof(lesips)); //on vérifie car on n'est pas content si ca foire if(*matrice==NULL) { //n'oublions pas de fermer le fichier fclose(lecteur); printf("erreur d'allocation\n"); getchar(); exit(1); } } } //on affiche le nombre d'ip printf("nombre d'ip lue: %d,cpt); }
Et le tour est joué [clindoeil]… Yu pourrais meme décider que parsing renvoie un entier qui serait, dans ce cas-ci avantageusement le nombre d'ip lues [clindoeil]

Modifié par koala01 le 30/05/2006 21:40
Publicité
koala01
 Posté le 30/05/2006 à 21:44 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien
Le problème semble effectivement venir de tes mallocs et reallocs… La synthaxe en est pointeur=malloc(une_taille); realloc(pointeur,nouvelle_taile); L'astuce, c'est que le meilleur moyen d'avoir une taille correcte passe par la fonction sizeof() dont la synthaxe est sizeof(type_a_utiliser);… Cela signifie que malloc devient pointeur=malloc(nombre*sizeof(type_utilise)); et realloc devient realloc(pointeur,nombre*sizeof(type_utilise)); Remarque que, systématiquement, il y a une paire de parenthese pour malloc/realloc, et une autre pour sizeof [clindoeil]
Page : [1] 
Page 1 sur 1

Vous devez être connecté pour participer à la discussion.
Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !
Recevoir PC Astuces par e-mail


La Lettre quotidienne +226 000 inscrits
Avec l'actu, des logiciels, des applis, des astuces, des bons plans, ...

Les bonnes affaires
Une fois par semaine, un récap des meilleurs offres.

Les fonds d'écran
De jolies photos pour personnaliser votre bureau. Une fois par semaine.

Les nouveaux Bons Plans
Des notifications pour ne pas rater les bons plans publiés sur le site.

Les bons plans du moment PC Astuces

Tous les Bons Plans
109,99 €Ecran PC 23,8 pouces Acer K243Ybmix (Full HD, 75 Hz, IPS, 1 ms) à 109,99 €
Valable jusqu'au 19 Juin

Cdiscount fait une promotion sur l'écran PC 23,8 pouces Acer K243Ybmix qui passe à 109,99 € alors qu'on le trouve ailleurs à partir de 125 €. Cet écran possède une dalle IPS Full HD (1920x1080) qui offre un temps de réponse de 1 ms un rafraichissement de 75 Hz (FreeSync). Il dispose d'entrées VGA et HDMI et intègre des haut-parleurs (2W)


> Voir l'offre
12,99 €Ensemble clavier + souris Logitech MK120 à 12,99 €
Valable jusqu'au 20 Juin

Amazon fait une superbe promotion sur l'ensemble clavier + souris Logitech MK120 qui passe à 12,99 € alors qu'on le trouve habituellement autour de 25 €. Ce duo combine simplicité, confort, et prix attractif. Le clavier, silencieux, présente des touches à l'écriture particulièrement lisible et au design ultra-plat, couplées à une barre espace suffisamment incurvée pour améliorer la position de vos mains pendant que vous l'utiliserez. Résistant aux éclaboussures, il saura se protéger des accidents éventuels. Quant à la souris 3 boutons, nécessitant elle aussi un port USB pour fonctionner, elle se présente sous une forme ambidextre qui satisfera le plus grand nombre.


> Voir l'offre
69,99 €Ecouteurs intra-auriculaires sans fil Bluetooth Jabra Elite 65t à 69,99 €
Valable jusqu'au 22 Juin

Darty fait une promotion sur les écouteurs intra-auriculaires sans fil Bluetooth Jabra Elite 65t qui passent à 69,99 € livrés gratuitement. On les trouve ailleurs à partir de 110 €. Côté son, l'égaliseur personnalisable vous permet d'ajuster le rendu sonore tandis que la technologie avancée à quatre microphones supprime les bruits de fond lors des appels pour des conversations limpides. Au quotidien, ces écouteurs Jabra restent parfaitement en place et proposent même une fonction de commande vocale simplifiée. 

Enfin, vous apprécierez les 5 heures d'autonomie avec une seule charge, qui se transforment en 15 heures avec l'étui de recharge compact.  Les Jabra Elite 65t sont certifiés IP55 et offrent une garantie de 2 ans contre l’humidité et la poussière. Où que vous soyez et quelle que soit votre activité, vous profitez d’une liberté absolue pour les appels et la musique.


> Voir l'offre

Sujets relatifs
Programme Perl :: Erreur de segmentation
Erreur de script de internet explorer !
Code erreur Windows Live Mail
Erreur sur C++
erreur '3265'
Erreur à la compilation à cause des headers
Erreur java script
vb6 getobject erreur ouverture fichier excel
Problem d'erreur aide moi j debute en C
Erreur nouveau projet code::blocks
Plus de sujets relatifs à Erreur de segmentation
 > Tous les forums > Forum Autres langages