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 :

Recoder malloc démarrage


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 61
    Par défaut Recoder malloc démarrage
    Bonjour à tous,
    Voilà j'aurai une petite question à propos de mon malloc. Ma structure t_block contient trois champs (size_t size, t_block next, et int free).
    Voici mon code de démarage:

    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
    void *malloc(size_t size)
    {
      t_block       bloc;
     
      bloc = sbrk(0);
      sbrk (sizeof (struct s_block) + size);
      bloc->size = size;
      if(brk(sbrk(size)) == -1)
      {
        errno = ENOMEM;
        return (NULL);
      }
      else
        return (bloc);
    }
    En fait pour le début je voudrais simplement renvoyer un pointeur sur l'espace mémoire alloué (si ça a réussit) et que l'utilisateur puisse ajouter des données dans le nouvel espace mémoire. Et renvoyer NULL si ça a échoué en mettant errno à ENOMEM. Mon soucis c'est que je ne sais pas si il faut que je fasse bloc = sbrk (sizeof (struct s_block) + size); car c'est bien beau je retourne bien un pointeur à la fin mais est-ce qu'il c'est déplacé? Ma question doit être stupide mais c'est juste que je doute. Merci pour vos réponses!

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu ne devrais pas utiliser sbrk() à chaque fois: Avec un tel code, tu ne pourras pas faire de free().

    Mon conseil:
    • Commence par gérer un tas dans un buffer de taille fixe (même un simple static unsigned char buf[1lu << 16]), avec ta(tes) liste(s) (doublement) chaînée(s) de blocs.
    • Ensuite, envisage de passer à sbrk() et de faire grandir ton tas quand il est plein.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 61
    Par défaut
    Le problème c'est que je dois utiliser uniquement des brk et des sbrk, merci pour la réponse en tout cas!

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    brk/sbrk, c'est typiquement à faire une fois que le reste marche. Et typiquement, par blocs (genre, tu agrandis ton tas à chaque fois de 64ko)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. question sur malloc (je dois le recoder)
    Par lludol dans le forum C
    Réponses: 10
    Dernier message: 31/01/2014, 09h00
  2. Recoder malloc, free, mallopt, realloc
    Par Onche dans le forum Débuter
    Réponses: 1
    Dernier message: 05/12/2013, 20h47
  3. recode du malloc
    Par soryo dans le forum C
    Réponses: 2
    Dernier message: 31/01/2012, 11h25
  4. Recoder la fonction malloc en C
    Par theyoks dans le forum Linux
    Réponses: 5
    Dernier message: 24/02/2011, 18h50
  5. Recoder malloc -> Questions sur la mémoire
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 15/03/2006, 18h11

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