Problem de mémoire

Résolu
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

  1. Contributeur
    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,
    1. Bonjour, et bien trop lourd comme code sources, utilisant les listes chaînées (+1)
      à bientôt
  2. 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
    
    1. Contributeur
      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.
    2. 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 * )
    3. Contributeur
      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.
    4. j'ai compris Mercie boucoup fiddy tu m'as boucoup aider
    5. il y'a un autre problème au niveau de la fonction affichage car le
       lister->premier 
      ne veux pas incrémenter...
  3. 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; 
    }