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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 Expert
    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
    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 averti
    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
    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
    Membre Expert
    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
    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.

  5. #5
    Membre averti
    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
    Par défaut
    Ok, ça y est, j'ai bien compris. Merci pour vos explications.

  6. #6
    Membre Expert
    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
    Par défaut
    Salut,

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

  7. #7
    Futur Membre du 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
    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#

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