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 :

problème avec free


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 43
    Points : 23
    Points
    23
    Par défaut problème avec free
    Bonjour,

    j'ai ecris une fonctionne qui libere de la memoire mais quand j'execute il ya une segmentation fault:

    voici la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void freeInt3d(int*** tab, int taillel, int taillec){
    printf("freeInt3d\n");
    int i, j;
    for(i=0 ; i<taillel ; i++){
    for(j=0; j<taillec; j++)
    free(tab[i][j]);
    free(tab[i]);
    }
    free(tab);
    }

  2. #2
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Citation Envoyé par nhella22 Voir le message
    j'ai ecris une fonctionne qui libere de la memoire mais quand j'execute il ya une segmentation fault
    à quel moment dans l'exécution ?

    Peut-on voir la ou les parties de code correspondant aux allocations de mémoire autour du int*** ?
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 43
    Points : 23
    Points
    23
    Par défaut
    voici mon programme

    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
    29
    30
    31
    32
    33
    #include <stdio.h>
    #include <stdlib.h>
     
    void freeChar3d(char*** tab, int taillel, int taillec){
    	printf("freechar3d\n");
        	int i, j;
        	for(i=0 ; i<taillel ; i++){
            	for(j=0; j<taillec; j++)
                		free(tab[i][j]);
            	free(tab[i]);
        	}
        	free(tab);
    	printf("FIN  freechar3d\n");
    }
     
    char*** remplir(char* t, int tl, int tc){
    	int i,j;
    	char*** tab = malloc(tl * sizeof(char**));	
    	for(i=0 ; i<tl ; i++){
    		tab[i] = malloc(tc * sizeof(char*));
    		for(j=0 ; j<tc ; j++){
    			tab[i][j] = t;
    		}
    	}
    	return tab;
    }
     
    int main(){
    	char* t = "maman";
    	char*** tab = remplir(t,227,22);
    	freeChar3d(tab,227,22);
    	return 0;
    }
    voici ce qu'il m'affiche
    freechar3d
    *** glibc detected *** ./test: munmap_chunk(): invalid pointer: 0x0804867b ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x5c6591]
    /lib/tls/i686/cmov/libc.so.6(+0x6c80e)[0x5c780e]
    ./test[0x8048485]
    ./test[0x8048595]
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x571bd6]
    ./test[0x80483b1]
    ======= Memory map: ========
    00437000-00438000 r-xp 00000000 00:00 0 [vdso]
    0055b000-006ae000 r-xp 00000000 08:06 2051 /lib/tls/i686/cmov/libc-2.11.1.so
    006ae000-006af000 ---p 00153000 08:06 2051 /lib/tls/i686/cmov/libc-2.11.1.so
    006af000-006b1000 r--p 00153000 08:06 2051 /lib/tls/i686/cmov/libc-2.11.1.so
    006b1000-006b2000 rw-p 00155000 08:06 2051 /lib/tls/i686/cmov/libc-2.11.1.so
    006b2000-006b5000 rw-p 00000000 00:00 0
    008b5000-008d0000 r-xp 00000000 08:06 313 /lib/ld-2.11.1.so
    008d0000-008d1000 r--p 0001a000 08:06 313 /lib/ld-2.11.1.so
    008d1000-008d2000 rw-p 0001b000 08:06 313 /lib/ld-2.11.1.so
    00d5b000-00d78000 r-xp 00000000 08:06 2207 /lib/libgcc_s.so.1
    00d78000-00d79000 r--p 0001c000 08:06 2207 /lib/libgcc_s.so.1
    00d79000-00d7a000 rw-p 0001d000 08:06 2207 /lib/libgcc_s.so.1
    08048000-08049000 r-xp 00000000 08:06 131691 /home/nouha/LC4/Projet/test
    08049000-0804a000 r--p 00000000 08:06 131691 /home/nouha/LC4/Projet/test
    0804a000-0804b000 rw-p 00001000 08:06 131691 /home/nouha/LC4/Projet/test
    08672000-08693000 rw-p 00000000 00:00 0 [heap]
    b77f2000-b77f3000 rw-p 00000000 00:00 0
    b7803000-b7806000 rw-p 00000000 00:00 0
    bfa15000-bfa2a000 rw-p 00000000 00:00 0 [stack]
    Abandon

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Tu fais un free() sur les tab[i][j] qui n'ont pas été obtenu par malloc()
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    tab[i][j] = t;ne fait que faire pointer tab[i][j] sur le même espace mémoire que t, ainsi si par la suite tu fais free(tab[i][j]);tu supprimes cet espace. Vu que quelque soit i et j, tab[i][j] pointe sur la même chose dès la deuxième tentative de suppression tu as une erreur de type Segmentation fault.

    D'autre part char* t = "maman"; s'accompagnerai bien d'un malloc.
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 43
    Points : 23
    Points
    23
    Par défaut
    en faite moi g plutot un tableau char***
    - premiere etoile il ya 227 cases
    chacune d'elle pointe sur un tableau de 7 cases qui elle meme pointe sur un char*

    donc je sais pas comment faire pour utiliseer un free sur un char***

  7. #7
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Tu penses faire un tableau de char 3D alors que tu fait un tableau de char* 2D

    Citation Envoyé par TheGzD
    D'autre part char* t = "maman"; s'accompagnerai bien d'un malloc.
    Pour quelle raison ?

  8. #8
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Pour quelle raison ?
    parce que faire un free sur une variable qui n'a pas eu droit à son malloc avant, c'est un peu comme "croiser les effluves", c'est mal
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Citation Envoyé par TheGzD Voir le message
    parce que faire un free sur une variable qui n'a pas eu droit à son malloc avant, c'est un peu comme "croiser les effluves", c'est mal
    Non, pas dans ce cas précis. « "maman" » est une chaîne en lecture seule définie à la compilation, et le pointeur pointe directement dessus. Il n'y a pas de raison pour que cet espace soit alloué au runtime, ni libéré, donc.

  10. #10
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Il n'y a pas de raison pour que cet espace soit alloué au runtime, ni libéré, donc.
    à savoir exactement ce que je viens de dire
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 43
    Points : 23
    Points
    23
    Par défaut
    moi g un tableau rempli deja qui a ete allouer au prealable et je voudrai liberer cette espace

  12. #12
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Comme nous te l'avons déjà dit plus haut, tu ne peux pas volontairement libérer un espace que tu n'as pas dynamiquement alloué.
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 43
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par TheGzD Voir le message
    Comme nous te l'avons déjà dit plus haut, tu ne peux pas volontairement libérer un espace que tu n'as pas dynamiquement alloué.
    je n'ai pas compris, ça veut dire quoi dynamiquement alloué ?

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    je n'ai pas compris, ça veut dire quoi dynamiquement alloué ?
    Cela a été dit plus haut : avec malloc.

  15. #15
    Membre à l'essai
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Mars 2011
    Messages : 16
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par nhella22 Voir le message
    je n'ai pas compris, ça veut dire quoi dynamiquement alloué ?
    C'est ce que tu fais depuis le début du topic de discussion avec malloc() quand même. L'allocation dynamique est particulièrement utile, par exemple, lorsque l'on ne connait le contenu et la taille d'un tableau qu'à l’exécution du programme (lors du développement, on ne peut donc pas précisez la taille de ce tableau puisque c'est l'utilisateur qui va la préciser par exemple). C'est une notion assez facile à assimiler, mais qui requiert une bonne connaissance des pointeurs principalement. Je te redirige vers ce document.

    Bonne continuation !
    neow_

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 43
    Points : 23
    Points
    23
    Par défaut
    Merci de votre aide a tous. C'est bon j'ai enfin compris.

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

Discussions similaires

  1. problème avec free et delete
    Par saloua dans le forum C++Builder
    Réponses: 6
    Dernier message: 04/10/2011, 07h20
  2. Problème avec free()
    Par Invité dans le forum Débuter
    Réponses: 3
    Dernier message: 03/05/2011, 15h14
  3. Réponses: 1
    Dernier message: 07/02/2008, 21h40
  4. Problème PHP avec Free
    Par shikakus dans le forum Free
    Réponses: 8
    Dernier message: 05/03/2007, 14h36
  5. Problème avec un free
    Par Franck.H dans le forum C
    Réponses: 5
    Dernier message: 28/12/2005, 20h03

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