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
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 569
 
Salut,

Il faut allouer de la mémoire à ton pointeur.
0
rocksider Messages postés 106 Date d'inscription   Statut Membre Dernière intervention   9
 
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 569
 
Re,

disque_dur[i].cluster
Contient quoi exactement?
0
rocksider Messages postés 106 Date d'inscription   Statut Membre Dernière intervention   9
 
typedef struct cluster
{
int adresse;
char cluster[256];
}cluster;

cluster disque_dur[50];

voilàà ^^
0
rocksider Messages postés 106 Date d'inscription   Statut Membre Dernière intervention   9
 
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   Statut Contributeur Dernière intervention   1 845
 
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   Statut Membre Dernière intervention   9
 
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   Statut Contributeur Dernière intervention   1 845
 
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   Statut Membre Dernière intervention   9
 
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   Statut Contributeur Dernière intervention   1 845
 
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   Statut Membre Dernière intervention   9
 
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   Statut Contributeur Dernière intervention   1 845
 
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   Statut Membre Dernière intervention   9
 
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