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 :

Interrogation sur un free() de pointeurs sur pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 5
    Par défaut Interrogation sur un free() de pointeurs sur pointeurs
    Bonjour à toutes et à tous ,

    Il s'avère que j'ai besoin de faire un tableau à 3 dimensions à allocation dynamique.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    char (**dateheure)[50];
     
    //allocation
    dateheure = malloc(3 * sizeof(*dateheure));
    for(i = 0;i<3;i++)
    		dateheure[i] = malloc(100000*sizeof(**dateheure));
     
    //libération
    for(i = 0;i<3;i++)
    		free(dateheure[i]);
    free(dateheure);

    Ainsi, j'ai plusieurs questions qui me turlupinent :

    1°) Si au lieu de 100000, j'ai quelque chose de variable en fonction de i (ex : 100000, 500 et 30), on est bien d'accord que j'allouerai exactement (100000+500+30)*50 ?

    2°) La méthode de libération est ici correcte, mais est-ce qu'un seul free(dateheure); suffirait ?

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int (*tableau)[4];
     
    tableau = malloc(5 * sizeof(*tableau));
    Ainsi on aura déclaré un tableau de 5 tableaux de 4 entiers chacun (équivalent à int tableau[5][4].

    Libération de mémoire allouée

    Pour libérer la mémoire, on doit utiliser la fonction free toujours, et lui donner en paramètre le pointeur sur l'espace alloué à l'aide de malloc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int (*tableau)[4];
     
    //----Allocation-----
    tableau = malloc(5 * sizeof(*tableau));
    if(tableau == NULL){
        //Notifier l'erreur
        exit(EXIT_FAILURE);
    }
     
    //----Libération en cas d'allocation réussie-----
    free(tableau);
    La deuxième dimension sera libérée automatiquement donc pas besoin de free pour le faire.
    Ainsi on remarque que ce type est beaucoup plus rapide d'utilisation (en terme d'allocation/libération de mémoire) du fait qu'il ne nécessite pas de boucles.
    Voilà, le but étant évidemment d'avoir quelque chose du style char dateheure[3][n][50].

    Merci d'avance,

    Cordialement,

    Martin.

  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
    1) Au total, tu aurais alloué (100000+500+30)*50 + 3*sizeof(pointeur)
    2) Dans le code proposé, un free(dateheure) seul ne suffirait pas. Il est possible de faire un bloc libérable en une seule fois, mais quand on a ainsi un double pointeur, il est plus simple d'allouer deux blocs: Un pour les pointeurs (3*sizeof(pointeur)), un pour les données ((100000+500+30)*50).
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 5
    Par défaut
    1°) Oui, en effet, erreur d'inattention pour celle-là..

    2°) Très bien, merci beaucoup


    Bonne journée,

    Martin.

    Résolu !

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

Discussions similaires

  1. Pointeurs et pointeurs de pointeurs
    Par wallace27 dans le forum C
    Réponses: 10
    Dernier message: 09/04/2015, 22h07
  2. Réponses: 21
    Dernier message: 06/08/2009, 09h31
  3. Réponses: 6
    Dernier message: 26/05/2007, 00h33
  4. Réponses: 6
    Dernier message: 02/11/2006, 16h44
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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