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 :

fonctions malloc / free


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 14
    Points : 12
    Points
    12
    Par défaut fonctions malloc / free
    Bonsoir à tous,

    Le code ci-dessous :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #include <stdio.h>
    #include <stdlib.h>
     
    main()
    {
        int N;
        printf("Donnez le nombre de caractères à lire");
        scanf("%d", &N);
        char *tab;
        int nbc, nbt, i, j, k;
    	char nomFichier[21];
     
        tab=malloc((N+1)*sizeof(char));
     
    	FILE *fichier;
     
    	printf("nom du fichier à lister : ");
    	scanf("%20s", nomFichier);
     
    	fichier = fopen(nomFichier, "r");
     
        while (!feof(fichier))
        {
            nbc=fread(&tab[30*j],sizeof(char),30, fichier);
            j++;
            nbt=nbc+nbt;
        }
     
     
     
        while (*tab!='\0') {
            printf("%c", *tab);
            tab++;
     
        }
     
        printf("\n");
    	fclose(fichier);
    	printf("%d", nbt);
        free(tab);
     
     
    }
    renvoie l'erreur suivante :
    FichierSimple.exe(284) malloc: *** error for object 0x103b00c2e: pointer being freed was not allocated
    *** set a breakpoint in malloc_error_break to debug
    926Abort trap: 6

    Alors que si je remplace la boucle while par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (k=0; k<nbt; k++ )printf("%c",tab[k]);
    Je n'ai plus de message d'erreur.
    Pourriez-vous svp m'aider à comprendre pourquoi ?
    Merci !

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Points : 2 502
    Points
    2 502
    Par défaut
    Bonsoir,

    Ligne 33 tab++;

    La fonction free doit être appelé avec en paramètre l'adresse à laquelle la mémoire été allouée par le malloc

  3. #3
    Membre à l'essai
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Merci pour ta réponse. Malheureusement, j'ai sans doute mal compris puisque j'ai effectué la modification suivante :
    Afin de passer à free la même adresse que malloc
    Et j'obtiens toujours la même erreur.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Salut,

    Si je n'ai pas fais d'erreur en lisant ton code, tu incrementes ton ton pointeur tab jusqu'a ce qu'elle pointe sur la case qui a pour valeur '\0' et tu free ton pointeur a partir de cette adresse ce qui ne me semble pas logique.
    J'ai essayé de compiler ton code sous ubuntu mais malheureusement j'ai un segfault juste apres avoir saisie le nom du fichier

    J'avais une question a poser mais pour éviter de réouvrir un sujet, et comme on parle déja de free / malloc la voici http://developpeurs.plaza42.com/ques...eau-de-string#

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Points : 2 502
    Points
    2 502
    Par défaut
    Re.

    j'ai sans doute mal compris puisque j'ai effectué la modification suivante free(&tab[0]);
    Je confirme free(&tab[0]) et free(tab) c'est la même chose. Ca ne change pas l'adresse de tab.

    Par contre tab++; change la valeur de tab.

    Et on le rencontre dans la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       while (*tab!='\0') {
            printf("%c", *tab);
            tab++;
        }
    qui au passage doit être équivalente à printf("%s",tab);.

    Mais le problème dans cette boucle c'est que le pointeur tab est incrémenté tab++.
    Cette écriture est ~équivalente à tab = tab + 1;Donc l'adresse sur laquelle il pointe change.

    Et arrivé à la ligne free(tab);, et bien tab ne contient plus l'adresse où la mémoire a été alloué
    au moment de tab=malloc((N+1)*sizeof(char));.
    Il est quelques adresses plus loin. Du coup

    C'est plus clair ?

    @Mashadow : Ton problème est différent. Ouvre un autre sujet stp.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2012
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Ok, ça y est, j'ai bien compris. Merci pour vos explications.

  7. #7
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Points : 2 502
    Points
    2 502
    Par défaut
    Salut,

    Content de voir que les choses sont plus claires .
    Il ne reste plus qu'a passer le sujet
    A+

  8. #8
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 559
    Points
    1 559
    Par défaut
    Ce qui me surprend, c'est que ce code fonctionne à tous les coups.

    Que vaut j lors de la première lecture?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            nbc=fread(&tab[30*j],sizeof(char),30, fichier)
    Pour moi, j n'est pas initialisé et vaut n'importe quoi, ce qui expliquerait le segfault de mashadow.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

Discussions similaires

  1. Surcharge des fonctions malloc et free
    Par Aspic dans le forum C
    Réponses: 7
    Dernier message: 22/04/2013, 13h52
  2. Utilisation des fonctions malloc() et free()
    Par m.badji dans le forum Débuter
    Réponses: 3
    Dernier message: 23/02/2013, 13h04
  3. Question sur la fonction malloc et free
    Par yann458 dans le forum Débuter
    Réponses: 4
    Dernier message: 27/05/2012, 09h21
  4. fonction malloc en c
    Par Invité(e) dans le forum C
    Réponses: 2
    Dernier message: 15/04/2006, 23h34
  5. Réponses: 3
    Dernier message: 27/02/2006, 08h52

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