Problem de mémoire

Résolu/Fermé
informatique_c Messages postés 30 Date d'inscription mardi 22 juillet 2014 Statut Membre Dernière intervention 17 mars 2016 - 31 oct. 2014 à 03:00
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 1 nov. 2014 à 15:33
voila mon code et je ne c'est pas pourquoi ça marche pas ....
//---------------------------------------------------------------------------------------


#include <stdio.h>
#include <stdlib.h>
<code c>
//-------------------------------------

typedef struct MAILLION MAILLION;
struct MAILLION{
char* nom;
char* prenom;
char position;
int valeur ;
MAILLION* suiv;
};
//--------------------------------------
typedef struct LISTE LISTE;
struct LISTE{
MAILLION* premier;
};
//--------------------------------------
//typedef lliste* LISTE;
//--------------------------------------
//LISTE equipe,Dg,Dd,Dm,Da;
//--------------------------------------
LISTE* construction_liste(){
LISTE * equipe=(LISTE*)malloc(sizeof(LISTE));
return equipe;
}
void ajouter_tete(LISTE * equipe){
MAILLION* joueur = (MAILLION*)malloc(sizeof(MAILLION));
puts("Faites entrez :");
printf("le Nom :\n");
scanf("%s",(joueur->nom));
printf("Le Prenom :\n");
scanf("%s",(joueur->prenom));
printf("La position :\n");
getchar();// vider la ligne
joueur->position=getchar();
printf("La Valeur :\n");
scanf("%d",&(joueur->valeur));
joueur->suiv=equipe->premier;
equipe->premier=joueur;
}
void affichage(LISTE* lister){
while(lister->premier!=NULL){
printf(" %s %s %c %d \n\n",lister->premier->nom,lister->premier->prenom,lister->premier->position,lister->premier->valeur);
lister->premier=lister->premier->suiv;
}
}
int main()
{
LISTE * equipe = construction_liste();
int i=20;
while(i!=10){
ajouter_tete(equipe);
i++;
}
affichage(equipe);
return 0;
}
</code>

3 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
31 oct. 2014 à 09:54
Pourquoi enlever le "Bonjour" mis en place automatiquement ???
La politesse est de rigueur sur CCM.

Je n'ai pas tout lu (tu as mal utilisé les balises "code c", du coup, ce n'est pas trop lisible), mais je vois déjà un gros problème.
Tu as alloué la structure maillon, mais tu n'as pas alloué les champs qui la composent (nom, ...). Du coup segfault.

Note : tu as oublié les free().

Cdlt,
2
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
Modifié par sambia39 le 1/11/2014 à 15:33
Bonjour, et bien trop lourd comme code sources, utilisant les listes chaînées (+1)
à bientôt
0
informatique_c Messages postés 30 Date d'inscription mardi 22 juillet 2014 Statut Membre Dernière intervention 17 mars 2016 1
Modifié par informatique_c le 31/10/2014 à 11:00
bonjourd fiddy oué dsl j'été presser , tu veux dire qu'il faux allouer le nom, prenom ,position et valeur ??
tu veux dire comme ça :
ex :
 char * (joueur->nom)=(char*)malloc(sizeof(char));//chêne de caractères
 char * (joueur->prenom)=(char*)malloc(sizeof(char));//chêne de caractères
 char (joueur->position)=(char)malloc(sizeof(char));//caractère
 int (joueur->valeur)=(int)malloc(sizeof(int));//entier
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
31 oct. 2014 à 10:53
Oui, il faut allouer chacun des pointeurs.
Attention, tes exemples sont faux.
Je t'en donne un correct :
joueur->nom=malloc(TAILLE);

Pas besoin de cast et il ne faut pas oublier de mentionner la taille de l'allocation. Le sizeof(char) fait systématiquement 1. Donc tu n'es pas obligé de le mettre.
0
informatique_c Messages postés 30 Date d'inscription mardi 22 juillet 2014 Statut Membre Dernière intervention 17 mars 2016 1
Modifié par informatique_c le 31/10/2014 à 11:13
j'ai fais :
joueur->nom=malloc(sizeof(char*));//chêne de caractères
 joueur->prenom=malloc(sizeof(char*));//chêne de caractères
 joueur->position=malloc(sizeof(char));//caractère
 joueur->valeur=malloc(sizeof(int));//entier
 joueur->valeur=malloc(sizeof(int));//entier
joueur->suiv=malloc(sizeof(LISTE));

est-se-que c'est juste ??
je veux dire le type du sizeof des chaines nom et prenom (esque c juste de maitre le * )
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
31 oct. 2014 à 11:20
Non, ce n'est pas bon...
Par TAILLE, j'entends la longueur de la chaîne souhaitée.
Si par exemple, tu veux que nom est une taille de 50 alors :
<code c>joueur->nom=malloc(50);
Etc.
Pour int valeur, il n'y a rien à allouer ce n'est pas un pointeur...
Et pour MAILLION* suiv; il n'y a rien à allouer non plus. Il s'agit de sauvegarder l'adresse sur le maillon suivant lors d'un ajout de noeud à la liste.
0
informatique_c Messages postés 30 Date d'inscription mardi 22 juillet 2014 Statut Membre Dernière intervention 17 mars 2016 1
31 oct. 2014 à 11:30
j'ai compris Mercie boucoup fiddy tu m'as boucoup aider
0
informatique_c Messages postés 30 Date d'inscription mardi 22 juillet 2014 Statut Membre Dernière intervention 17 mars 2016 1
31 oct. 2014 à 11:37
il y'a un autre problème au niveau de la fonction affichage car le
 lister->premier 
ne veux pas incrémenter...
0
informatique_c Messages postés 30 Date d'inscription mardi 22 juillet 2014 Statut Membre Dernière intervention 17 mars 2016 1
31 oct. 2014 à 10:52
voila
#include <stdio.h>
#include <stdlib.h>

//------------------------------------- 
typedef struct MAILLION MAILLION; 
struct MAILLION{ 
char* nom; 
char* prenom; 
char position; 
int valeur ; 
MAILLION* suiv; 
}; 
//-------------------------------------- 
typedef struct LISTE LISTE; 
struct LISTE{ 
MAILLION* premier; 
}; 
//-------------------------------------- 
LISTE* construction_liste(){ 
LISTE * equipe=(LISTE*)malloc(sizeof(LISTE)); 
return equipe; 
} 
void ajouter_tete(LISTE * equipe){ 
MAILLION* joueur = (MAILLION*)malloc(sizeof(MAILLION)); 
puts("Faites entrez :"); 
printf("le Nom :\n"); 
scanf("%s",(joueur->nom)); 
printf("Le Prenom :\n"); 
scanf("%s",(joueur->prenom)); 
printf("La position :\n"); 
getchar();// vider la ligne 
joueur->position=getchar(); 
printf("La Valeur :\n"); 
scanf("%d",&(joueur->valeur)); 
joueur->suiv=equipe->premier; 
equipe->premier=joueur; 
} 
void affichage(LISTE* lister){ 
while(lister->premier!=NULL){ 
printf(" %s %s %c %d \n\n",lister->premier->nom,lister->premier->prenom,lister->premier->position,lister->premier->valeur); 
lister->premier=lister->premier->suiv; 
} 
} 
int main() 
{ 
LISTE * equipe = construction_liste(); 
int i=20; 
while(i!=10){ 
ajouter_tete(equipe); 
i++; 
} 
affichage(equipe); 
return 0; 
} 
0