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 :

pointeur petit question


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 382
    Points : 73
    Points
    73
    Par défaut pointeur petit question
    Bonjour j'aimerais savoir quelque chose en ce qui concerne les pointeurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int *a, *b ;
    a = (int*)malloc(50*sizeof(int));
    b = a ;
    ...
    free(a) ;
    Doit-je faire aussi un free(b) ou pas besoin ?

    merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    non, mais tu devrais faire un
    après free, pense à remettre ton pointeur à NULL (idem après un fclose())

  3. #3
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Tu dois faire autant d'appels à free() que tu as fait d'appels à malloc(). Dans ton code, les pointeurs a et b pointent sur le même espace mémoire. Une fois ce dernier libéré, l'adresse contenue dans les deux variables devient invalide. C'est pourquoi, comme l'a rapellé salseropom, il est fortement conseillé d'affecter aux deux pointeurs la valeur NULL (qui a l'avantage d'être une adresse invalide testable).

    Au passage, il n'est pas nécessaire (voir même déconseillé) de convertir explicitement la valeur retournée par malloc en un pointeur sur int. De plus, il faut toujours tester la valeur retournée par malloc(). Même dans un snippet, j'écris toujours au moins:

    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
    int *a = NULL;
    int *b = NULL;
     
    /* L'écriture suivante facilite la maintenance part rapport à malloc(50 * sizeof(int)); */
    a = malloc(50 * sizeof *a);
    if (a != NULL)
    {
        b = a ;
        /* ... */
        free(a), a = NULL, b = NULL;
    }
    else
    {
        /* traiter convenablement l'erreur l'allocation memoire */
    }
    Thierry

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 382
    Points : 73
    Points
    73
    Par défaut
    D'accord. merci
    Donc le code correct serais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int *a,*b ;
    a = (int*)malloc(sizeof(int)*50);
    b = a;
       ... // manipulation de b et de a. avec b qui pointe toujours sur a.
    free(a); // je libère a.
    a = NULL ;
    b = NULL ;
    Par contre je voulais savoir si il était possible d'allouer de la mémoire via une fonction sans faire un retour :

    int *taille(int n)
    {
    return (int *)malloc(sizeof(int)*50);
    }

    Peut-on faire un truc du genre :

    taille(int **tab,int n)
    {
    *tab = (int *)malloc(sizeof(int)*50);
    }

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par damien77 Voir le message
    D'accord. merci
    Donc le code correct serais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int *a,*b ;
    a = (int*)malloc(sizeof(int)*50);
    b = a;
       ... // manipulation de b et de a. avec b qui pointe toujours sur a.
    free(a); // je libère a.
    a = NULL ;
    b = NULL ;
    Non, le code correct est celui que j'ai donné.

    Thierry

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 382
    Points : 73
    Points
    73
    Par défaut
    désolé, nous avons postez en même temps, j'ai pas vue ta réponse...
    Sinon pour la 2nd question ?

  7. #7
    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 damien77 Voir le message
    D'accord. merci
    Donc le code correct serais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int *a,*b ;
    a = (int*)malloc(sizeof(int)*50);
    b = a;
       ... // manipulation de b et de a. avec b qui pointe toujours sur a.
    free(a); // je libère a.
    a = NULL ;
    b = NULL ;
    Genre têtu, hein ? On te dit que le cast est inutile en C.

    http://emmanuel-delahaye.developpez....tes.htm#malloc
    Par contre je voulais savoir si il était possible d'allouer de la mémoire via une fonction sans faire un retour :

    int *taille(int n)
    {
    return (int *)malloc(sizeof(int)*50);
    }
    Oui, mais le code est plus complexe du fait des indirectins...
    Peut-on faire un truc du genre :

    taille(int **tab,int n)
    {
    *tab = (int *)malloc(sizeof(int)*50);
    }
    Oui, mais il faut vérifier si tab est <> NULL avant de l'utiliser...

    Encore une fois, le cast est inutile.

  8. #8
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par damien77 Voir le message

    Peut-on faire un truc du genre :

    taille(int **tab,int n)
    {
    *tab = (int *)malloc(sizeof(int)*50);
    }
    Oui. Il faut s'assurer au préalable que tab n'est pas NULL. Par ailleurs, le prototype de ta fonction n'est pas correct. Tu dois préciser le type de la valeur retournée. Si elle ne retourne rien, tu dois l'indiquer par void. Personnellement, je préfère dans ce cas retourner un code d'erreur:

    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
    /* Cette fonction alloue de la memoire. La fonction appellante est 
        responsable de sa liberation*/
    int taille(int **tab, int n)
    {
        err = 0;
        if (tab != NULL)
        {
            *tab = malloc(n * sizeof **tab);
            if (*tab != NULL)
            { 
                /* Suite du code ... */
            }
            else
            {
                /* Erreur d'allocation memoire */
                err = 2;
            }
        }
        else
        {
            /* Erreur d'argument */
            err = 1;
        }
        return err;
    }
    Thierry

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 382
    Points : 73
    Points
    73
    Par défaut
    Désolé pour le cast une vieille habitude...
    D'accord, je penserais à faire les tests la fois prochaine ...

    &tab = adresse de la variable.
    tab = donne l'adresse du pointeur qui pointe sur le tableau
    *tab = adresse du tableau
    **tab = valeur du 1er élément du tableau

    Existe-il d'autre cas d'utilisation de cette notation assez barbare ?

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Oui, certains cas de tableau à deux dimensions alloués dynamiquement.
    Des tableaux de ce genre-là, notamment :
    http://www.developpez.net/forums/sho...3&postcount=14

Discussions similaires

  1. Petites questions sur un pointeur vers vector
    Par Kaluza dans le forum Débuter
    Réponses: 1
    Dernier message: 08/01/2012, 09h18
  2. petite question sur les pointeurs
    Par Krisprolls31 dans le forum C
    Réponses: 4
    Dernier message: 20/08/2010, 22h19
  3. Réponses: 15
    Dernier message: 25/10/2009, 22h02
  4. Petite question pointeurs Delphi
    Par peter27x dans le forum Langage
    Réponses: 4
    Dernier message: 06/01/2009, 15h57
  5. une petite question sur les pointeurs
    Par guy777 dans le forum C
    Réponses: 4
    Dernier message: 06/10/2006, 17h44

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