Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

Malloc et free



  1. #1
    patagouin

    Smile Malloc et free


    ------

    Bonsoir,

    Ma question suit ce code:
    ex:
    Code:
    int *tab=(int*)malloc(4*sizeof(*tab));
        tab[0]=1;
        tab[1]=2;
        tab[2]=3;
        //tab[3]=0;
        int *var=tab;
        free(tab);
    1) Est-ce que après ce code var pourra, tout comme tableau pouvait le faire, utilisé les éléments du tableau sans qu'ils soient modifiés de l'extérieur?

    Autres petites questions en passant, a quoi sert la fonction calloc si ce n'est de faire la même chose que malloc (qui initialise aussi ses éléments à 0)?.

    Même question que 1) avec ce code:
    Code:
    int *tab=(int*)malloc(4*sizeof(*tab));
        tab[0]=1;
        tab[1]=2;
        tab[2]=3;
        tab[3]=0;
        int var=*tab; // la mémoire locale alloué sur une mémoire dynamique est elle valable après la désallocation
        free(tab);
    Je vous remercie d'avance.
    Bonne soirée
    Patagouin

    -----

  2. Publicité
  3. #2
    Jack
    Modérateur

    Re : Malloc et free

    1) Est-ce que après ce code var pourra, tout comme tableau pouvait le faire, utilisé les éléments du tableau sans qu'ils soient modifiés de l'extérieur?
    Non, puisque cette zone pourra être réaffectée par l'OS.

    Autres petites questions en passant, a quoi sert la fonction calloc si ce n'est de faire la même chose que malloc (qui initialise aussi ses éléments à 0)?.
    Il me semble justement que malloc n'initialise pas la mémoire réservée.

    A+

  4. #3
    bzh_nicolas

    Re : Malloc et free

    Citation Envoyé par patagouin Voir le message
    1) Est-ce que après ce code var pourra, tout comme tableau pouvait le faire, utilisé les éléments du tableau sans qu'ils soient modifiés de l'extérieur?
    Non, tu as désalloué la mémoire, donc tu ne peux plus l'utiliser.
    Lorsque tu alloues une zone mémoire elle est "marqué" comme utilisée, tu peux donc... l'utiliser. Une fois désallouée elle est marquée libre, tu ne sais donc pas ce que tu manipules. Une autre instruction de ton programme peu l'utiliser, la modifier, changer le type des variables qu'elle contient, etc...

    Citation Envoyé par patagouin Voir le message
    Autres petites questions en passant, a quoi sert la fonction calloc si ce n'est de faire la même chose que malloc (qui initialise aussi ses éléments à 0)?.
    malloc n'initialise pas la zone mémoire à 0, elle la laisse telle quelle. Si elle contenait déjà des 0, cela reste des 0, sinon cela reste la valeur du moment de l'allocation.
    Remarque : si tu compile en debug, cela n'est pas forcément vrai. La plupart des debugger initialise les zones mémoire nouvellement allouée pour simplifier le debug. Par exemple ici pour le debugger de visual C++, mais cela peut changer d'un debugger à l'autre.

    Dans le second cas, ça marche à condition que tu restes dans la même fonction car var est une variable locale. MAIS ça ne fait surement pas ce que tu penses que cela fait. En fait tu déclares un int et tu y met la valeur du premier élément du tableau.

  5. #4
    patagouin

    Re : Malloc et free

    Merci à vous deux. Je n'ai pas réfléchi, il s'agit bien en effet d'une copie qui sera stocké ailleurs.

  6. A voir en vidéo sur Futura
  7. #5
    Jack
    Modérateur

    Re : Malloc et free

    Je ne comprends pas trop ton histoire de copie ...

    A+

  8. #6
    Chanur

    Re : Malloc et free

    Bonjour,
    Citation Envoyé par Jack Voir le message
    Je ne comprends pas trop ton histoire de copie ...

    A+
    Dans le deuxième exemple, var contient une copie du contenu de tab[0], donc 1, copie qui n'est évidemment pas affectée par le free().
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  9. Publicité
  10. #7
    Jack
    Modérateur

    Re : Malloc et free

    D'accord.

    A+

  11. #8
    fred1599

    Re : Malloc et free

    Pour une copie il faut passer automatiquement par la boucle for ou memcpy. Pour un débutant il est préférable pour l'instant de se contenter de la boucle for.

    Code:
    int main(void)
    {
        int tab[3];
        int var[3];
        int i;
    
        tab[0]=1;
        tab[1]=2;
        tab[2]=3;
    
        for(i=0; i<3; i++)
        {
            var[i] = tab[i];
            printf("%d\n", var[i]);
        }
        return 0;
    }

Discussions similaires

  1. Fonction malloc(langage C)
    Par deyni dans le forum Programmation et langages, Algorithmique
    Réponses: 28
    Dernier message: 20/10/2012, 15h57
  2. Free
    Par Jeanmanuel dans le forum Internet - Réseau - Sécurité générale
    Réponses: 4
    Dernier message: 26/05/2010, 19h33
  3. free
    Par bernex dans le forum Internet - Réseau - Sécurité générale
    Réponses: 1
    Dernier message: 16/04/2009, 13h04
  4. problème avec malloc en C
    Par olver62 dans le forum Logiciel - Software - Open Source
    Réponses: 5
    Dernier message: 06/03/2009, 18h33
  5. PostgreSQL et Free
    Par Rhydderch dans le forum Internet - Réseau - Sécurité générale
    Réponses: 0
    Dernier message: 10/08/2008, 15h48