Erreur de segmentation avec strcpy
Résolu
rocksider
Messages postés
106
Date d'inscription
Statut
Membre
Dernière intervention
-
rocksider Messages postés 106 Date d'inscription Statut Membre Dernière intervention - 18 janv. 2009 à 21:42
rocksider Messages postés 106 Date d'inscription Statut Membre Dernière intervention - 18 janv. 2009 à 21:42
9 réponses
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é
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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 ^^
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
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';
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.