VIVEZ LE
FOOTBALL !

Posez votre question Signaler

Erreur de segmentation avec strcpy [Résolu]

rocksider 106Messages postés 21 octobre 2008Date d'inscription 16 mars 2012Dernière intervention - Dernière réponse le 18 janv. 2009 à 21:42
Bonjour,
Je travaille dans un programme ou y'a cette fonction
[code]
void fct()
{
char *pointeur,donnes_temp[15];
pointeur=disque_dur[i].cluster; // cette derniere est une variable globale
scanf("%s",donnes_temp);
strcpy(pointeur,donnes_temp);
}
/code
est ce que je peux pas copier une chaine de caractere dans un pointeur ?
Lire la suite 

Erreur de segmentation avec strcpy »

13 réponses
Réponse
+0
moins plus
Salut,

Il faut allouer de la mémoire à ton pointeur.
Ajouter un commentaire
Réponse
+0
moins plus
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é
Ajouter un commentaire
Réponse
+0
moins plus
Re,

disque_dur[i].cluster
Contient quoi exactement?
rocksider- 18 janv. 2009 à 16:32
typedef struct cluster
{
int adresse;
char cluster[256];
}cluster;

cluster disque_dur[50];

voilàà ^^
Ajouter un commentaire
Réponse
+0
moins plus
typedef struct cluster
{
int adresse;
char cluster[256];
}cluster;

cluster disque_dur[50];

voilà ^^
Ajouter un commentaire
Réponse
+0
moins plus
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 :
scanf("%s",disque_dur[i].cluster);
ou encore mieux :
fgets(disque_dur[i].cluster,sizeof disque_dur[i].cluster,stdin);

Cdlt
rocksider- 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 ^^
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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';
Ajouter un commentaire
Réponse
+0
moins plus
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 :
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- 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 ^^
Ajouter un commentaire
Réponse
+0
moins plus
Plutôt :
while((c=fgetc(stdin))!='\n' && c!=EOF);

ou :
while((c=getchar())!='\n' && c!=EOF);
rocksider- 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
Ajouter un commentaire
Ce document intitulé « Erreur de segmentation avec strcpy » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?