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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 43
    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 éprouvé
    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 : 43
    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
    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*** ?

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 43
    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 confirmé
    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
    Par défaut
    Tu fais un free() sur les tab[i][j] qui n'ont pas été obtenu par malloc()

  5. #5
    Membre éprouvé
    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 : 43
    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
    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.

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 43
    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 émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    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 ?

+ 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