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 :

[linux] probleme avec free()


Sujet :

C

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    502
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 502
    Points : 227
    Points
    227
    Par défaut [linux] probleme avec free()
    bonjour,

    je travail sous eclipse j'ai un processeur 64 bits peut être le cause ?
    j'ai juste fait un petit programme de test :
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main (int argc, char** argv)
    {
    	int c=5;
    	int * point =(int*) malloc( sizeof(int));
    	printf("%d\n le c",c);
    	point=&c;
    	*point=6;
    	printf("%d le point\n",c);
    	free(point);
     
     
    	return 0;}
    le programme me retourne une 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
    26
    *** glibc detected *** /home/dev/workspace/pointuer/Debug/pointuer: free(): invalid pointer: 0xbf8ea88c ***
    ======= Backtrace: =========
    /lib/libc.so.6[0x4d83adf1]
    /lib/libc.so.6(cfree+0x90)[0x4d83e430]
    /home/dev/workspace/pointuer/Debug/pointuer[0x804846d]
    /lib/libc.so.6(__libc_start_main+0xe0)[0x4d7e8f70]
    /home/dev/workspace/pointuer/Debug/pointuer[0x8048351]
    ======= Memory map: ========
    08048000-08049000 r-xp 00000000 fd:00 10420814   /home/dev/workspace/pointuer/Debug/pointuer
    08049000-0804a000 rwxp 00000000 fd:00 10420814   /home/dev/workspace/pointuer/Debug/pointuer
    0892c000-0894d000 rwxp 0892c000 00:00 0 
    4ce02000-4ce1d000 r-xp 00000000 fd:00 14712871   /lib/ld-2.6.so
    4ce1d000-4ce1e000 r-xp 0001a000 fd:00 14712871   /lib/ld-2.6.so
    4ce1e000-4ce1f000 rwxp 0001b000 fd:00 14712871   /lib/ld-2.6.so
    4d7d3000-4d921000 r-xp 00000000 fd:00 14712873   /lib/libc-2.6.so
    4d921000-4d923000 r-xp 0014e000 fd:00 14712873   /lib/libc-2.6.so
    4d923000-4d924000 rwxp 00150000 fd:00 14712873   /lib/libc-2.6.so
    4d924000-4d927000 rwxp 4d924000 00:00 0 
    4e3ba000-4e3c5000 r-xp 00000000 fd:00 14713989   /lib/libgcc_s-4.1.2-20070503.so.1
    4e3c5000-4e3c6000 rwxp 0000a000 fd:00 14713989   /lib/libgcc_s-4.1.2-20070503.so.1
    b7d00000-b7d21000 rwxp b7d00000 00:00 0 
    b7d21000-b7e00000 --xp b7d21000 00:00 0 
    b7f07000-b7f08000 rwxp b7f07000 00:00 0 
    b7f1c000-b7f1e000 rwxp b7f1c000 00:00 0 
    b7f1e000-b7f1f000 r-xp b7f1e000 00:00 0          [vdso]
    bf8d8000-bf8ee000 rw-p bf8d8000 00:00 0          [stack]

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	printf("%d\n le c",c);
    	/* point=&c; */
    	*point=6;
    ça marche beaucoup mieux, mais ce n'est surement pas ce que tu veux faire.

    Tu essaies de libèrer la mémoire allouée pour la variable c et non celle que tu as alloué toi-même. Ne t'étonnes-pas si tu as des problèmes...

  3. #3
    Membre régulier Avatar de Beldom
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 63
    Points : 70
    Points
    70
    Par défaut
    Cela vient de ton
    Tu modifie la valeur du pointeur, pas de la valeur.
    Donc tu as déplacé ton pointeur, le free essaie donc d'agir sur quelque chose qui n'a pas été alloué.

    Normalement, si tu veux que point soit egal à l'adresse de c, tu dois le déclarer sans faire de malloc, puis dire point = &c.
    Et donc pas besoin de free.

    Si tu malloc, tu ne dois pas utiliser c, mais uniquement *point.

    J'espère avoir été clair, sinon, n'hésite pas à demander plus de d'explication.

  4. #4
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Asmod_D Voir le message
    int * point =(int*) malloc( sizeof(int));
    Il est imperatif de tester le retour de malloc. Malloc peut echouer.
    En outre le cast (int*) n'est pas utile et il peut etre plus avantageux de remplacer sizeof(int) par sizeof *point

    Citation Envoyé par Asmod_D Voir le message
    point=&c;
    L'adresse obtenue par malloc vient d'etre ecraser par l'adresse de la variable c. Tu ne pourras donc pas liberer la memoire alloue

    Citation Envoyé par Asmod_D Voir le message
    free(point);
    l'adresse contenue dans point n'etant pas une adresse fournie par malloc mais celle de la variable c, cette adresse n'est pas liberable ==> BUG

    En outre apres avoir liberer de la memoire il est recommande de reinitialiser le pointeur a NULL, ce qui permet de tester la validite du pointeur dans le reste du code

  5. #5
    Membre averti Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Points : 441
    Points
    441
    Par défaut
    En faisant un malloc tu réserves une zone mémoire de la taille d'un int, or tu n'as pas du tout utiliser cette zone puisque tu n'as pas manipulé directement *point. En faisant point=&c tu à juste "déplacé" le pointeur étant donné qu'il ne pointera plus sur la zone allouée et qu'il pointera sur la même zone que c. Or &c n'a pas été allouée donc ne peut être libérée.
    Citation Envoyé par gl Voir le message
    il peut etre plus avantageux de remplacer sizeof(int) par sizeof *point
    Quels sont les avantages de sizeof(*point) par rapport à sizeof(int) ? Merci.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 86
    Points : 109
    Points
    109
    Par défaut
    Quels sont les avantages de sizeof(*point) par rapport à sizeof(int) ? Merci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int * ptr =NULL;
    ptr = malloc(sizeof (*ptr));
    if(ptr == NULL)exit(EXIT_FAILURE);

    maintenant tu veux pas un int * mais un char * , tu n'as qu'a changer le type .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char * ptr =NULL;
    ptr = malloc(sizeof (*ptr));/* la taille du type pointé par ptr */
    if(ptr == NULL)exit(EXIT_FAILURE);

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    502
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 502
    Points : 227
    Points
    227
    Par défaut
    C vrai que j'ai quelques problemes avec les pointeurs

    merci !

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

Discussions similaires

  1. probleme avec free.fr
    Par patsolaar dans le forum Free
    Réponses: 1
    Dernier message: 15/10/2007, 17h23
  2. Réponses: 3
    Dernier message: 25/08/2007, 23h34
  3. Réponses: 5
    Dernier message: 05/12/2006, 14h04
  4. [Lazarus] Linux : problème avec le deboggueur
    Par Pigoulou dans le forum Lazarus
    Réponses: 1
    Dernier message: 22/12/2005, 15h35
  5. [linux] Probleme avec la libpcap
    Par uriel0105 dans le forum C
    Réponses: 2
    Dernier message: 12/10/2005, 22h59

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