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] Récupérer la taille à partir d'un pointeur ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    Avril 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Avril 2006
    Messages : 92
    Par défaut [Allocation] Récupérer la taille à partir d'un pointeur ?
    Voila encore une question.

    Je voulais savoir, si on pouvais de récupérer la taille d'une zone mémoire à partir de son pointeur.

    Voila un petit exemple pour mieux comprendre :

    void * ptr=malloc(taille_en_octet);

    je peux récupérer la taille de la zone de mémoire pointé par ptr ? (Sans passer par une variable où dans lequel j'aurais mémorisé la taille.)

    J'ai pensé redéfinir une fonction malloc dans laquelle je stockerai la référence et la taille alloué. Le problème est pour les variables que j'ai pas initialisé avec mes fonctions.

    J'essaie de faire un code portable, mais qui doit tourner en priorité sous linux.

    Si vous avez des solutions un indice.

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    La solution propre est bien de garder une variable qui stocke la taille (qui est connue, puisqu'on appelle malloc). On peut faire une structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct
    {
      size_t size;
      void *data;
    } t_allocated;
    Il est fort possible que l'implementation de malloc() utilise une structure interne pour se "souvenir" de la taille allouee, mais elle n'est pas accessible a l'utilisateur.

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    le malloc standard non (enfin si, mais comme tu dis pas accessible).

    C'est la raison pour laquelle le free ne libère pas vraiment la mémoire... (enfin, que en général la mémoire utilisée par ton programme ne diminue pas).

    Il est possible avec les packages de debugmalloc d'avoir la vraie allocation et sa taille.

    Mais d'une part c'est relativement compliqué, d'autre part en refaire un est du suicide pour un débutant...

    Enfin, pour ce qui est la complexité, ce n'est pas trop la partie malloc, mais la partie free..

    Car en effet, pour qu'effectivement tu puisses diminuer effectivement la mémoire, il faudrait qu'AUCUN des espaces alloués ne soit stocké dans un variable...

    Une représentation graphique permet de mieux comprendre .

    Soit un programme dont le code en mémoire occupe la place A. Soient 2 tableaux alloués successivement B et C.

    On peut avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    A
    -------------------
    B
                       -----------------
    C
                                        --------------------
    Maintenant, si tu libères B, pour réduire vraiment la mémoire, il faudrait que tu rapatries l'espace C à l'endroit où était B.

    Sauf que le libérateur n'a AUCUN moyen de savoir où tu as stocké l'adresse de cet espace, et donc de MODIFIER la valeur pointée..

  4. #4
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    Avril 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Avril 2006
    Messages : 92
    Par défaut
    DaZumba => J'avais pas pensé a ta solution. Maintenant que tu le dis c'est idiot d'avoir cherche si complique.

    souviron34 => Mon But n'est pas d'optimiser la gestion de mémoire, loin de la. Mais de pouvoir traiter des zones de mémoire entière de taille inconnue, pour pouvoir : copier celle ci, inversé tous les bits de celle ci...

    Bref la solution du "t_allocated" me conviens bien. mais pour les zones que j'ai pas alloué, je vais faire une fonction qui vas transformer ce void * en t_allocated avec une fonction du style :

    t_allocated new_t_allocated(void * ptr,size_t size);

    si j'ai pas moyen de la récupérer à ce moment là, je serai coincé.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/05/2010, 15h12
  2. Réponses: 11
    Dernier message: 24/04/2008, 13h15
  3. Réponses: 1
    Dernier message: 18/02/2007, 19h33
  4. Réponses: 2
    Dernier message: 13/08/2004, 16h50
  5. Réponses: 3
    Dernier message: 23/01/2004, 21h02

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