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

Réseau C Discussion :

mon realloc perso


Sujet :

Réseau C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Points : 80
    Points
    80
    Par défaut mon realloc perso
    Bonjour a tous !

    Dans la famille redifinition de fonction je voudrais le realloc !

    J'ai fais ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void *Monrealloc(void *ptr, size_t size)
    {
         void * monNouveauPointeur = Monmalloc(size);
         memcpy(monNouveauPointeur, ptr, size);
         Monfree(ptr);
         return (void *)monNouveauPointeur;
    }
    Ca a l'air de marcher mais est ce que le realloc fonctionne comme ceci ?

    La raison de cette redeclaration est dû a des pb memoires que j'observe sur un system embarqué. En effet, il arrive parfois que la libération d'un pointeur null fasse planter la machine... Est ce normal ?

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par gdpasmini
    Ca a l'air de marcher mais est ce que le realloc fonctionne comme ceci ?
    Pas tout à fait. Si le pointeur d'initial est NULL, le comportement doit être défini (ce qui n'est pas le cas ici).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       if (ptr != NULL)
       {
          memcpy(monNouveauPointeur, ptr, size);
       }
       ...
    Note : Le cast à la fin est inutile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       return monNouveauPointeur;
    La raison de cette redeclaration
    Tu veux sans doute dire redéfinition...
    est dû a des pb memoires que j'observe sur un system embarqué. En effet, il arrive parfois que la libération d'un pointeur null fasse planter la machine... Est ce normal ?
    Non. Il doit y avoir un autre problème, genre débordement de bloc alloué ou utilisation de pointeur non initialisé ou NULL...
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Il faut copier une quantité de données correspondant à ce qui était alloué précédemment, pas ce qui est nouvellement alloué.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pour être précis, il faut copier la plus petite des deux tailles (oui, on peut se servir de realloc() pour réduire un espace alloué).

    Et aussi, une implication plus profonde de Monrealloc() dans ta gestion du tas pourrait permettre de changer la taille "sur place" s'il n'y a rien qui gène (100% de réussite pour un rétrécissement)...
    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.

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Pas tout à fait. Si le pointeur d'initial est NULL, le comportement doit être défini (ce qui n'est pas le cas ici).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       if (ptr != NULL)
       {
          memcpy(monNouveauPointeur, ptr, size);
       }
       ...
    Il me semble que si le pointeur passé en paramètre est NULL, realloc se comporte comme malloc. Cela peut varier d'une implémentation à une autre ?
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Points : 80
    Points
    80
    Par défaut
    ok merci beaucoup.. mais pour copier la plus petite des deux tailles, il faut connaitre la taille précédement allouée or lors du realloc on a plus accès a cette information .. Si ?

    D'autre part, lors de mes tests, un free fait reellement planter ma machine..
    J'ai donc rajouté une protection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Monfree(void * ptr)
    {
      if(ptr == NULL)
        return;
      else
       free(ptr);
    }
    Depuis, ca plante moin...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est anormal, il me semble bien que la norme dit que free(NULL) doit "échouer" silencieusement...
    (à l'inverse de fclose(NULL) qui est indéfini)
    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.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Points : 80
    Points
    80
    Par défaut
    Je ne comprends pas non plus pk si un pointeur n'est pas initialisé a NULL, il peut planté lors de l'allocation...

    D'autre part, comment obtenir la taille précédement allouée ?

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Il faut copier une quantité de données correspondant à ce qui était alloué précédemment, pas ce qui est nouvellement alloué.
    Exact, sinon, on lit dans une zone en partie indéterminée.

    Problème, on ne connait pas cette taille, donc on est cuit, on ne peut pas écrire son realloc()...

    Affaire réglée.
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Franck.H
    Il me semble que si le pointeur passé en paramètre est NULL, realloc se comporte comme malloc.
    Ben oui, d'où la protection de memcpy() par le if ...
    Cela peut varier d'une implémentation à une autre ?
    Pas si ces implémentations sont conformes au C standard.
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Franck.H
    Il me semble que si le pointeur passé en paramètre est NULL, realloc se comporte comme malloc. Cela peut varier d'une implémentation à une autre ?
    Ben oui, d'où la protection de memcpy()...

    De toutes façons, comme l'a fait remarqué Jean Marc, on ne peut pas créeer son realloc() [1]. Affaire classée...

    -----------------------
    [1] à moins de passer un paramètre en plus : 'ancienne_taille'...
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Points : 80
    Points
    80
    Par défaut
    on ne peut pas ecrire son propre realloc ?

    La protection du memcpy ne le permet il pas ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Problème, on ne connait pas cette taille, donc on est cuit, on ne peut pas écrire son realloc()...

    Affaire réglée.
    Pour être précis, je dirais qu'on ne peut pas écrire de realloc() à un niveau supérieur à celui des malloc() et free() : Le realloc doit au moins être au même niveau, voire à un niveau inférieur.
    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.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Points : 80
    Points
    80
    Par défaut
    ola, dsl mai je comprends pas l'histoire des niveaux...

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par gdpasmini
    ok merci beaucoup.. mais pour copier la plus petite des deux tailles, il faut connaitre la taille précédement allouée or lors du realloc on a plus accès a cette information .. Si ?
    Non. D'où problème. A part passer l'info sous la forme d'un paramètre, je ne vois pas d'issue.
    D'autre part, lors de mes tests, un free fait reellement planter ma machine..
    J'ai donc rajouté une protection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Monfree(void * ptr)
    {
      if(ptr == NULL)
        return;
      else
       free(ptr);
    }
    Depuis, ca plante moin...
    Ca n'a strictement rien résolu du tout.

    Déjà cité, mais tellement à-propos :

    "Ce n'est pas en cassant le thermomètre qu'on guéri le malade."
    Pas de Wi-Fi à la maison : CPL

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 382
    Points : 80
    Points
    80
    Par défaut
    pourtant je vous assure qu'en mettant un printf avant et apres le free, je vois clairement qu'il ne sort jamais de mon free..

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par gdpasmini
    Je ne comprends pas non plus pk si un pointeur n'est pas initialisé a NULL, il peut planté lors de l'allocation...
    T'as lu ça où ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       T *p;
     
       p = malloc(...);
    et
    sont parfaitement valides.
    D'autre part, comment obtenir la taille précédement allouée ?
    Il faut s'en souvenir. (une variable, par exemple, ou une structure qui regroupe le pointeur et la taille allouée).
    Pas de Wi-Fi à la maison : CPL

  18. #18
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par gdpasmini
    pourtant je vous assure qu'en mettant un printf avant et apres le free, je vois clairement qu'il ne sort jamais de mon free..
    On se tue à te dire que c'est la conséquence d'un problème qui c'est passé avant, comme un débordement de mémoire, ce qui a détruit le gestionnaire de mémoire allouée, d'où le crash. Isole ton code à coup de #if 0 #endif jusqu'à trouver le fautif...
    Pas de Wi-Fi à la maison : CPL

  19. #19
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Problème, on ne connait pas cette taille, donc on est cuit, on ne peut pas écrire son realloc()...
    Si on écrit les fonctions malloc, realloc et free, ce qui a l'air d'être le cas de l'OP, on peut stocker cette taille quelque part de sorte qu'on la retrouve après. On en a de toute manière besoin aussi pour le free.

    Une technique est de faire précéder les blocs de leur taille.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  20. #20
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Si on écrit les fonctions malloc, realloc et free, ce qui a l'air d'être le cas de l'OP...
    Ca m'a tout l'air d'être de simples wrappers... Pour le reste, OK. attention aux problèmes d'alignement !
    Pas de Wi-Fi à la maison : CPL

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 5 12345 DernièreDernière

Discussions similaires

  1. Vos avis sur mon site perso
    Par Fildz dans le forum Mon site
    Réponses: 12
    Dernier message: 19/08/2006, 22h07
  2. Mon site perso
    Par matech dans le forum Mon site
    Réponses: 11
    Dernier message: 08/08/2006, 23h29
  3. Probléme d'execution de mon Kernel perso
    Par bouazza92 dans le forum C
    Réponses: 54
    Dernier message: 05/08/2006, 12h16
  4. Mon site perso : les pages d'Alex6891 - avis
    Par alex6891 dans le forum Mon site
    Réponses: 10
    Dernier message: 25/07/2006, 17h35
  5. [C#] Comment implementer mon Navigateur perso par défaut ?
    Par ArHacKnIdE dans le forum Windows Forms
    Réponses: 8
    Dernier message: 12/02/2006, 18h53

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