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
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 ?

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
Salut,

Il faut allouer de la mémoire à ton pointeur.
0
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
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é
0
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
Re,

disque_dur[i].cluster
Contient quoi exactement?
0
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
typedef struct cluster
{
int adresse;
char cluster[256];
}cluster;

cluster disque_dur[50];

voilàà ^^
0
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
typedef struct cluster
{
int adresse;
char cluster[256];
}cluster;

cluster disque_dur[50];

voilà ^^
0

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
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
0
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
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 ^^
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: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
0
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
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';
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
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.
0
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
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 ^^
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 à 21:37
Plutôt :
while((c=fgetc(stdin))!='\n' && c!=EOF);

ou :
while((c=getchar())!='\n' && c!=EOF);
0
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
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
0