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 :

code free pour libérer l'alloc dynamique, est-ce correct?


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Par défaut code free pour libérer l'alloc dynamique, est-ce correct?
    Bonjour

    j'ai crée un tableau de flottant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //j'ai besoin d'un tableau T[N+1][M+N+1]
    float **T=NULL; // tableau T
    T = malloc ((N+1)*sizeof(float));      // nb de lignes = N+1
    for (i = 0;i<N+1;i++) 
    T[i]=malloc ((M+N+1)*sizeof(float)); //nb de colonnes = M+N+1
    comment rendre ou libérer l'alloc dynamique?
    je propose le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for(i = 0;i <= N+1;i++)
        {
         free(T[i]);
        }
        free(T);
    est-ce correct?

    merci

  2. #2
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par isidore
    comment rendre ou libérer l'alloc dynamique?
    je propose le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for(i = 0;i <= N+1;i++)
        {
         free(T[i]);
        }
        free(T);
    est-ce correct?
    Elle me semble correcte ta libération mais juste une chose:
    comme tu l'as fait pour l'allocation


    J'ajouterais un
    à la fin sauf si c'est en fin de programme où cela ne changera pas grand chose mais sinon cela permet de savoir si effectivement le pointeur pointe sur une adresse ou non.
    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 !

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    A priori, oui...

    Mais le malloc me chipote...

    C'est à confirmer, mais il me semble que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //j'ai besoin d'un tableau T[N+1][M+N+1]
    float **T=NULL; // tableau T
    T = malloc ((N+1)*sizeof(float));      // nb de lignes = N+1
    for (i = 0;i<N+1;i++) 
        T[i]=malloc ((M+N+1)*sizeof(float)); //nb de colonnes = M+N+1
    devrait etre modiffié sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //j'ai besoin d'un tableau T[N+1][M+N+1]
    float **T=NULL; // tableau T
    T = malloc ((N+1)*sizeof(float *));      // nb de lignes = N+1
    for (i = 0;i<N+1;i++) 
        T[i]=malloc ((M+N+1)*sizeof(float)); //nb de colonnes = M+N+1
    car, ta matrice T devrait conenir N+1...pointeur sur des réels

    Ensuite, meme si je ne l'ai pas mis dans la correction, n'oublie jamais que toute tentative d'allocation doit etre testée pour savoir si elle a réussi ...

    Cela ferait quelque chose du genre de
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    int dec; /* pour pouvoir compter les desallocations */
    T = malloc ((N+1)*sizeof(float *));  /*allocation d'un tableau de pointeurs */
    if(T!=NULL)
    {
        for (i = 0;i<N+1;i++)
        { 
            T[i]=malloc ((M+N+1)*sizeof(float)); /* allocation de la ligne */
            if(T[i]==NULL) /* l'allocation a  rate */
            {
                 printf("Impossible d'allouer la memoire pour la ligne %d\n",i);
                 printf("Libération de la mémoire\n");
                 for(dec=0;dec<i;dec++)
                 {
                     free(T[dec]);
                     T[dec]=NULL;
                 }
                 free T;
                 T=NULL;
                  return EXIT_FAILURE;
            }
        }
    }
    else
    {
        printf("Impossible d'allouer la memoire pour la matricen",i);
        return EXIT_FAILURE;
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    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 : 47
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par koala01
    ...devrait etre modiffié sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //j'ai besoin d'un tableau T[N+1][M+N+1]
    float **T=NULL; // tableau T
    T = malloc ((N+1)*sizeof(float *));      // nb de lignes = N+1
    for (i = 0;i<N+1;i++) 
        T[i]=malloc ((M+N+1)*sizeof(float)); //nb de colonnes = M+N+1
    A ce compte là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //j'ai besoin d'un tableau T[N+1][M+N+1]
    float **T=NULL; // tableau T
    T = malloc ((N+1)*sizeof(*T));      // nb de lignes = N+1
    for (i = 0;i<N+1;i++) 
        T[i]=malloc ((M+N+1)*sizeof(**T)); //nb de colonnes = M+N+1
    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 !

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Citation Envoyé par Franck.H
    A ce compte là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //j'ai besoin d'un tableau T[N+1][M+N+1]
    float **T=NULL; // tableau T
    T = malloc ((N+1)*sizeof(*T));      // nb de lignes = N+1
    for (i = 0;i<N+1;i++) 
        T[i]=malloc ((M+N+1)*sizeof(**T)); //nb de colonnes = M+N+1
    Aussi...

    Toujours est-il que, au moment où j'ai écrit le message, j'étais pris d'un doute étrange ("irraisonné" diront certains ), mais, T étant un pointeur de pointeur, je confirme que, d'une manière ou d'une autre, il faut lui allouer de l'espace pour prendre des pointeurs...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par isidore
    est-ce correct?

    merci
    Non. Trouves-tu logique d'écrire d'un coté
    et de l'autre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i = 0;i <= N+1;i++)
    "Illogic, Captain !"
    -- Spock

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Par défaut
    c t une erreur d'écriture
    merci

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 80
    Par défaut
    au passage quelle différence entre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T = (float **) malloc ((N+1)*sizeof(float));
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     T = malloc ((N+1)*sizeof(float));
    j'étais parti sur le 1er truc d'après un code qui marchait sur internet mais en voulait vérifier ben j'ai trouvé qu'apparemment c t la 2ème solution mais à vrai dire je n'ai pas trop compris pk l'un que l'autre, je ais que les 2 fonctionnent c tout.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par isidore
    au passage quelle différence entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T = (float **) malloc ((N+1)*sizeof(float));
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     T = malloc ((N+1)*sizeof(float));
    http://emmanuel-delahaye.developpez....tes.htm#malloc

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

Discussions similaires

  1. Code js pour formulaire dynamique
    Par katchev dans le forum NodeJS
    Réponses: 0
    Dernier message: 02/01/2015, 16h17
  2. Réponses: 0
    Dernier message: 08/09/2013, 14h10
  3. Réponses: 0
    Dernier message: 04/01/2013, 15h39
  4. Code Java pour une liste dynamique
    Par Jean_Benoit dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 12/10/2011, 22h20
  5. Code HTML pour tableau dynamique ( devis )
    Par mawashi32 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 17
    Dernier message: 14/11/2009, 23h06

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