IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

allocation de memoire d'une liste de struct


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut allocation de memoire d'une liste de struct
    bonjour,

    j'essaye de comprendre un peu le concept de malloc, je ne sais pas comment le faire pour une array de struct.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct {
       int id;
       char name[30];
       int rooms;
    } Hall_info;
     
    main (){
     
    FILE *fp;
    char line[256];
    int nh, f=0,j;
     
    Hall_info *h;
    h = (Hall_info*) malloc(sizeof(Hall_info));
     
    if (h == NULL) {
          fprintf(stderr, "out of memory\n");
          exit(1);
    }
     
     fp = fopen("residencehalls.txt","r");
       while( fgets(line, 256, fp) ){
          if (line[0] != '#'){
             sscanf(line, "%s %i %i", h[f].name, &h[f].id, &h[f].rooms, );
             nh++;
           } f++;
          } fclose(fp);
    compile, mais ne me donne une seg fault... et meme pas le message d'erreur "out of memory". Je pense avoir loupe un episode.
    Des idees sur comment resoudre le probleme?

    merci

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    h = (Hall_info*) malloc(sizeof(Hall_info));
    n'alloue de la place que pour UNE seule structure Hall_info. Pour stocker n structures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    h = malloc(n*sizeof(Hall_info));
    Le cast est inutile.

  3. #3
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    doit-je attribuer une valeure intiale a 'n'?

    parce que je connais pas encore combien de structure le programme contiendra.

    meme apres avoir essayer de donner un valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    h = malloc(n * sizeof(Hall_info));
    il ya toujours la meme seg fault.
    est ce que la programmation est correcte ?

  4. #4
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Supposons que le n est égale à 10, il ne faut pas boucler plus de 10 fois sinon tu débordes en écrivant sur un espace mémoire non alloué ( d'où le SegFault ), à toi de faire le nécessaire.
    Il faut aussi vérifier que le fichier a bien été ouverts, en testant le retour de fopen .

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Points : 77
    Points
    77
    Par défaut
    si tu ne sais pas combien de structures tu auras tu peut utiliser les listes chainées qui seront allouées en mémoire à chaque nouvelle déclaration...

Discussions similaires

  1. [PHP 5.2] Allocation de memoire d'une fonction normal VS fonction static
    Par blackdevil86 dans le forum Langage
    Réponses: 1
    Dernier message: 31/01/2012, 10h41
  2. garder en memoire les champs d'une liste deroulante multiple
    Par eclipse012 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/01/2007, 10h55
  3. Réponses: 3
    Dernier message: 26/09/2006, 11h06
  4. Réponses: 44
    Dernier message: 18/05/2006, 16h19
  5. fuite de memoire dans une liste de pointeur sur composant
    Par Nicolos_A dans le forum Composants VCL
    Réponses: 2
    Dernier message: 16/12/2004, 08h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo