Erreur de segmentation avec strcpy
Résolu/Fermé
rocksider
Messages postés
106
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
16 mars 2012
-
18 janv. 2009 à 16:09
rocksider Messages postés 106 Date d'inscription mardi 21 octobre 2008 Statut Membre Dernière intervention 16 mars 2012 - 18 janv. 2009 à 21:42
rocksider Messages postés 106 Date d'inscription mardi 21 octobre 2008 Statut Membre Dernière intervention 16 mars 2012 - 18 janv. 2009 à 21:42
9 réponses
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
18 janv. 2009 à 16:17
18 janv. 2009 à 16:17
Salut,
Il faut allouer de la mémoire à ton pointeur.
Il faut allouer de la mémoire à ton pointeur.
rocksider
Messages postés
106
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
16 mars 2012
9
18 janv. 2009 à 16:23
18 janv. 2009 à 16:23
Euh je vois, mais j'ai besoin de changer la chaine disque_dur[i].cluster , c'est pourquoi j'ai fait pointeur=disque_dur[i].cluster; et donc la mémoire est dejà alloué
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
18 janv. 2009 à 16:25
18 janv. 2009 à 16:25
Re,
disque_dur[i].cluster
Contient quoi exactement?
disque_dur[i].cluster
Contient quoi exactement?
rocksider
Messages postés
106
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
16 mars 2012
9
18 janv. 2009 à 16:32
18 janv. 2009 à 16:32
typedef struct cluster
{
int adresse;
char cluster[256];
}cluster;
cluster disque_dur[50];
voilàà ^^
{
int adresse;
char cluster[256];
}cluster;
cluster disque_dur[50];
voilàà ^^
rocksider
Messages postés
106
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
16 mars 2012
9
18 janv. 2009 à 16:28
18 janv. 2009 à 16:28
typedef struct cluster
{
int adresse;
char cluster[256];
}cluster;
cluster disque_dur[50];
voilà ^^
{
int adresse;
char cluster[256];
}cluster;
cluster disque_dur[50];
voilà ^^
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
18 janv. 2009 à 16:38
18 janv. 2009 à 16:38
Salut,
Pourquoi passer par un buffer temporaire pour stocker les données avant de les mettre dans la variable cluster via un pointeur ?
Tu peux faire tout simplement :
Cdlt
Pourquoi passer par un buffer temporaire pour stocker les données avant de les mettre dans la variable cluster via un pointeur ?
Tu peux faire tout simplement :
scanf("%s",disque_dur[i].cluster); ou encore mieux : fgets(disque_dur[i].cluster,sizeof disque_dur[i].cluster,stdin);
Cdlt
rocksider
Messages postés
106
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
16 mars 2012
9
18 janv. 2009 à 16:48
18 janv. 2009 à 16:48
euh c'est juste parceque la chaine contient dejà 256 octet, et je dois copier plusieurs info dans cette derniere,
genre la chaine comportera :
Nom Prenom Age,
c'est juste un exemple( et c'est toujours cette structure qui va etre enregistré ), et je m'était dit qu'avec un pointeur ça serai plus simple,
donc le pointeur recevera nom qui sera stocké dans le debut dans le buffer temporaire ajoutera des espaces , jusqu'a une case précise et permettra la saisie du prenom...
c'est une simulation du stockage dans les cluster du disque dur ^^
genre la chaine comportera :
Nom Prenom Age,
c'est juste un exemple( et c'est toujours cette structure qui va etre enregistré ), et je m'était dit qu'avec un pointeur ça serai plus simple,
donc le pointeur recevera nom qui sera stocké dans le debut dans le buffer temporaire ajoutera des espaces , jusqu'a une case précise et permettra la saisie du prenom...
c'est une simulation du stockage dans les cluster du disque dur ^^
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
18 janv. 2009 à 17:03
18 janv. 2009 à 17:03
Eh bien, à partir de ces éléments-là, il n'y a pas d'erreurs. Le segfault peut venir aussi du fait que tu rentres trop de caractères dans le buffer (buffer overflow).
Tu devrais poster ton code épuré qui produit le segfault qu'on puisse avoir une vue d'ensemble.
Cdlt
Tu devrais poster ton code épuré qui produit le segfault qu'on puisse avoir une vue d'ensemble.
Cdlt
rocksider
Messages postés
106
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
16 mars 2012
9
18 janv. 2009 à 17:07
18 janv. 2009 à 17:07
au fait je voulais dire que c'est pas la structure nom prenom age qui sera toujours enregistré ... mais ça change pas grand chose au probleme voilà le code:
int i,j,taille=0,difference; char *pointeur,donnes_temp[15]; pointeur=disque_dur[i].cluster; printf("Donner l'enregistrement: \n"); for(i=0;i<nombre_champ;i++) { scanf("%s",donnes_temp); strcpy(pointeur,donnes_temp); j=0; pointeur=strchr(disque_dur[i].cluster,'\0'); //*pointeur=' '; difference=taille_champ-strlen(donnes_temp); while(j<difference) *pointeur++=' '; } *pointeur='\0';
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
18 janv. 2009 à 17:25
18 janv. 2009 à 17:25
Salut,
Déjà en C particulièrement, on teste toujours si la variable ne vaut pas NULL, ce qui permet d'éviter bon nombres de segfaults.
Par exemple, à chaque fois que tu fais "pointeur=..."; il faut mettre après une vérification du style :
Ca pourrait mieux t'aider à voir d'où viennent certains segfaults.
Sinon l'idée du strchr(...,'\0');, c'est spécial. Tu as l'utilisateur strcat (ou strncat) qui permet de faire de la concaténation. C'est ce que tu sembles vouloir faire.
Tu as mis quoi comme entrée au clavier ?
Sinon, mets ton code dans l'intégralité, il faut qu'on puisse tout voir, les #include, les fonctions globales, les fonctions le main etc. Si ton programme est trop grand, enlève toutes les parties inutiles jusqu'à obtenir un code compilable et qui reproduit ton segfault.
Déjà en C particulièrement, on teste toujours si la variable ne vaut pas NULL, ce qui permet d'éviter bon nombres de segfaults.
Par exemple, à chaque fois que tu fais "pointeur=..."; il faut mettre après une vérification du style :
if(pointeur==NULL){ fputs("erreur pointeur",stderr); exit(EXIT_FAILURE); }
Ca pourrait mieux t'aider à voir d'où viennent certains segfaults.
Sinon l'idée du strchr(...,'\0');, c'est spécial. Tu as l'utilisateur strcat (ou strncat) qui permet de faire de la concaténation. C'est ce que tu sembles vouloir faire.
Tu as mis quoi comme entrée au clavier ?
Sinon, mets ton code dans l'intégralité, il faut qu'on puisse tout voir, les #include, les fonctions globales, les fonctions le main etc. Si ton programme est trop grand, enlève toutes les parties inutiles jusqu'à obtenir un code compilable et qui reproduit ton segfault.
rocksider
Messages postés
106
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
16 mars 2012
9
18 janv. 2009 à 21:29
18 janv. 2009 à 21:29
J'ai trouvé l'erreur xD
j'avait oublié de mettre avec le scanf : while((c=fgetc())!='\n' && c!=EOF); xD
merci beaucoup de votre aide :)
et aussi pour l'idée de strcat qui m'avait echapé, elle pourrait bien me servir ^^
j'avait oublié de mettre avec le scanf : while((c=fgetc())!='\n' && c!=EOF); xD
merci beaucoup de votre aide :)
et aussi pour l'idée de strcat qui m'avait echapé, elle pourrait bien me servir ^^
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
18 janv. 2009 à 21:37
18 janv. 2009 à 21:37
Plutôt :
ou :
while((c=fgetc(stdin))!='\n' && c!=EOF);
ou :
while((c=getchar())!='\n' && c!=EOF);
rocksider
Messages postés
106
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
16 mars 2012
9
18 janv. 2009 à 21:42
18 janv. 2009 à 21:42
Non c fait, ça marche impecc c'eté du à un oubli de l'initiation de i :
pointeur=disque_dur[i].cluster;
i etait aléatoire , donc le pointeur pouvait pointé n'importe ou
pointeur=disque_dur[i].cluster;
i etait aléatoire , donc le pointeur pouvait pointé n'importe ou