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. 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; 
    } 
    
    1. 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...