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 :

malloc et réservation mémoire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Par défaut malloc et réservation mémoire
    Bonjour,

    j'aurai besoin d'une confirmation concernant malloc, j'ai lu (sur wikipedia pour ne pas le citer) que malloc réserve une zone mémoire de x caractères.

    Il faut ensuite la libérer avec la commande free.

    J'ai fais la conclusion que si je passe un pointeur dans une fonction, puis que je fais un malloc sur ce pointeur. La mémoire est réservé tant que je ne fais pas de free, donc je peux utiliser mon pointeur comme il me sied dans ma méthode main ?

    J'ai juste ?

  2. #2
    Membre confirmé Avatar de florianjoy54
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 155
    Par défaut
    normalement l'allocation se fait dans la fonction meme. (meilleur lisibilité)

    admettons que tu sois dans la fonction main:

    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
     
    int main()
    {
    int *memoire = NULL;
     
    memoire = malloc(sizeof(int)); // tu alloues la mémoire de la taille d'un int.
     
    if (memoire == NULL) // si l'allocation à échoué
    exit (0);
    else
    ... //suite du programme
     
     free(memoire); // Lorsqu'on a plus besoin de la mémoire, on la libère
     
    return (0);
    }

  3. #3
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Par défaut
    C'est plus propre de le faire avant ou sinon ça marche pas ?

    Car il me semblait mieux de m'assurer que le tableau allouer soit de la bonne taille.

    donc en gros ça ferait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    main(..)
    {
      int *tab;
      fonction(tab);
    }
     
    void fonction(int * tab)
    {
      tab = malloc(100);
    // traitement 
    }
    et une autre question dont j'arrive pas à trouver une réponse récente, quelle est la taille maximal d'un tableau ? Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int tab[x] = ...
    //x max =
    merci

  4. #4
    Membre confirmé Avatar de florianjoy54
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 155
    Par défaut
    c'est bon mais il est plus logique (pour moi) de connaitre la taille du tableau avant de le passer dans une fonction.

    La taille du tableaux maximum varie. Mais généralement c'est toi qui définie cette taille maximum.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define MAX 5
    int tab[MAX] = {1,2,3,4,5};
    De toute façon si tu dépasses cette taille maximum. tu seras alerté par un message du type segmentation fault ou autre

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Citation Envoyé par manticore Voir le message
    C'est plus propre de le faire avant ou sinon ça marche pas ?

    Car il me semblait mieux de m'assurer que le tableau allouer soit de la bonne taille.

    donc en gros ça ferait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    main(..)
    {
      int *tab;
      fonction(tab);
    }
     
    void fonction(int * tab)
    {
      tab = malloc(100);
    // traitement 
    }
    Pourquoi passer un pointeur en argument pour écraser sa valeur ?

  6. #6
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Par défaut
    Donc il est mieux de définir la taille du tableau avant, je vais le faire ainsi, j'imaginais qu'il était plus sûr de contrôler le malloc à l'intérieur de la fonction, surtout si l'on passe cette fonction à quelqu'un d'autre.

    Par contre si je fais un malloc dans une fonction, la case mémoire est conservé jusqu'à un free ? Où je ne peux pas utiliser cette variable dans mon "main" ?

    Merci de votre aide

  7. #7
    Membre confirmé Avatar de florianjoy54
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 155
    Par défaut
    oui tant que tu n'as pas free la zone mémoire est allouée.

    et tu free quand tu n'as plus besoin de la zone mémoire allouée.
    attention de free au bon endroit.

    tu pourrais glibc ...

  8. #8
    Expert confirmé
    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
    Par défaut
    Citation Envoyé par manticore Voir le message
    donc en gros ça ferait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    main(..)
    {
      int *tab;
      fonction(tab);
    }
     
    void fonction(int * tab)
    {
      tab = malloc(100);
    // traitement 
    }
    Ceci est faux.
    L'appel à la fonction fonction() ne peux pas modifier le tab de main() qui restera de valeur indéterminée : le tab de fonction() n'est qu'une copie du tab de main().

    Tu dois procéder de l'une de ces deux façons (en excluant évidemment l'usage de globales) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    main(..)
    {
      int *tab =  fonction();
    }
     
    int * fonction(void)
    {
      int *tab = malloc(100);
    // traitement 
      return tab;
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    main(..)
    {
      int *tab;
      fonction(&tab);
    }
     
    void fonction(int ** tab)
    {
      *tab = malloc(100);
    // traitement 
    }

  9. #9
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Par défaut
    Merci de cette correction, donc l'erreur vient probablement de la

    Donc malloc reécrit sur le pointeur qui est une copie de l'adresse. Donc l'adresse change...

    Merci encore

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Donc malloc reécrit sur le pointeur qui est une copie de l'adresse. Donc l'adresse change...
    malloc ne fait "que" allouer de la mémoire dynamique et retourner son adresse.
    Le problème dans ton code, c'était que tu assignais cette valeur (l'adresse retournée par malloc) à un pointeur local à ta fonction, ce qui avait trois conséquences :
    * la valeur était perdue à la fin de cette fonction
    * cela provoque une fuite de mémoire
    * le pointeur dans la fonction appelante ne peut pas être modifié

    D'où les deux solutions au choix proposées par diogene :
    * Soit la fonction appelée retourne l'adresse retournée par malloc, ce qui permet de l'assigner directement au pointeur de la fonction appelante.
    * Soit la valeur est modifiée via un pointeur de pointeur. Et pour cela, il faut donc passer à la fonction appelée non pas la valeur du pointeur mais son adresse, afin que sa valeur puisse être modifiée par la fonction appelée.

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

Discussions similaires

  1. Retour malloc NULL avec mémoire vive dispo
    Par Babcool dans le forum Débuter
    Réponses: 9
    Dernier message: 07/09/2010, 23h01
  2. Malloc/Realloc adaptation mémoire d'une entrée utilisateur
    Par realscandiumhyp dans le forum Débuter
    Réponses: 2
    Dernier message: 18/08/2009, 20h40
  3. Réservation, mémoire d'une variable Javascript ?
    Par 19cmos83 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/07/2007, 12h00
  4. Recoder malloc -> Questions sur la mémoire
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 15/03/2006, 18h11
  5. Pb d'allocation mémoire malloc
    Par oz80 dans le forum C++
    Réponses: 5
    Dernier message: 18/11/2005, 17h23

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