Problem de mémoire

Résolu
informatique_c Messages postés 32 Statut Membre -  
sambia39 Messages postés 610 Date d'inscription   Statut Membre Dernière intervention   -
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. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    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
    1. sambia39 Messages postés 610 Date d'inscription   Statut Membre Dernière intervention   50
       
      Bonjour, et bien trop lourd comme code sources, utilisant les listes chaînées (+1)
      à bientôt
      0
  2. informatique_c Messages postés 32 Statut Membre 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
    
    0
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
    2. informatique_c Messages postés 32 Statut Membre 1
       
      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
    3. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
    4. informatique_c Messages postés 32 Statut Membre 1
       
      j'ai compris Mercie boucoup fiddy tu m'as boucoup aider
      0
    5. informatique_c Messages postés 32 Statut Membre 1
       
      il y'a un autre problème au niveau de la fonction affichage car le
       lister->premier 
      ne veux pas incrémenter...
      0
  3. informatique_c Messages postés 32 Statut Membre 1
     
    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