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 :

malloc et free


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 10
    Par défaut malloc et free
    salut,

    J'ai un soucis avec free(), si j'allou deux blocs mémoires avec malloc() et que j'essais de libérer l'espace avec free() seul mon premier free est correctement effectué. L'autre se vide mais me laisse des caracteres spéciaux.

    exemple avec ce code:
    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>
     
    int main(int argv, char *argc[])
    {
     char *chaine1=NULL, *chaine2=NULL;
     int longueur=10, i=0, count=0;
     
    while(count!=longueur)
    {
    	chaine1=malloc(longueur * sizeof(*chaine1)); //je créer deux tableaux(sans vérifier le retour c'est pour l'exemple)
    	chaine2=malloc(longueur * sizeof(*chaine2));
     
    	for(i=0; i!=longueur; i++)
    	 {
    	  chaine1[i]='*', chaine2[i]='a'; // on rempli le premier avec *** et le deuxieme avec aaaa
    	 }
     
    puts(chaine1); //on affiche
    puts(chaine2);
     
    free(chaine1); // libération de l'espace
    free(chaine2);
     
    puts(chaine1); //on affiche encore pour verifier
    puts(chaine2);
     
    count++; //la boucle permet de mettre en evidence le fénomene.
    }
     
    return 0;
    }

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    free n'assure pas de changer le contenu, il assure seulement que le bloc mémoire sera libéré et disponible pour d'autres applis (encore que....).

    Si tu as besoin d'écraser le contenu, c'est à toi de le faire avant d'appeler free.

    Il y a des options à malloc pour obtenir des blocs mémoires pleins de '\0' ou d'autres valeurs, mais généralement peu de programmes fonctionnent avec....

    Essaye juste pour voir de faire un programme qui :
    1) alloue avec malloc
    2) affiche le contenu (avec write, pas printf)
    3) copie des carcatères dans ton bloc alloué
    4) affiche le contenu
    5) libère le contenu
    6) alloue de nouveau la même taille
    7) affiche le contenu (avec write)
    8) libère

    Et exécute-le plusieurs fois de suite... le résultat peut te surprendre.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 10
    Par défaut
    Je vais essayer mais je me doute déjà du résultat au vu de ce qui m'arrive.

    Mais ce que j'ai du mal à comprendre, c'est que lorsque j'alloue un tableau et que je le libère, tout va bien. Alors que si j'en alloue 2 rien ne va plus.

    Ce que je cherche à faire, c'est :

    Allouer deux tableaux ;
    Les remplir avec des choses différentes et faire ce qu'il y a à faire...
    Libérer l'espace ;
    Recommencer mais avec une taille de tableau différente (d'où l'utilisation de malloc) ;

    Seulement la réallocation marche que si le mot est plus grand que le précédent sinon j'ai un caractère qui reste...? (le code que j'ai mis met juste en avant mon souci)

  4. #4
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Tu ne devrais même pas essayer d'afficher ce qui a été free ! C'est tout...

    Si tu cherches à voir comment fonctionnent les internals, il faut commencer à s'intéresser à l'OS qui tourne, etc...

    Mais si c'est juste pour "faire le travail demandé", alors tu ne dois juste "pas" utiliser ce qui est free.

    Si tu veux agrandir un tableau simple, il y a realloc...
    ...sinon tu dois malloc avec la nouvelle taille, et tout recopier de l'ancien vers le nouveau, et libérer l'ancien.



    Et attends attends....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	chaine1=malloc(longueur * sizeof(*chaine1)); //je créer deux tableaux(sans vérifier le retour c'est pour l'exemple)
    	chaine2=malloc(longueur * sizeof(*chaine2));
    Tu as oublié le "+1" pour ajouter le '\0' final !
    Si pas de '\0', alors oui tu liras un peu trop de choses... (et il n'y en a pas dans ton for...)
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 10
    Par défaut
    sinon tu dois malloc avec la nouvelle taille, et tout recopier de l'ancien vers le nouveau, et libérer l'ancien.
    Heu... si j'ai bien compris je peut redimensionner mon tableau sans libérer l'espace? ou j'y suis pas du tout?

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 480
    Par défaut
    Citation Envoyé par pouic13 Voir le message
    Heu... si j'ai bien compris je peut redimensionner mon tableau sans libérer l'espace? ou j'y suis pas du tout?
    Non. Ce que Metalman essaie de te dire, c'est que malloc() ne fait que « réserver » de la mémoire, c'est-à-dire demander au système de lui allouer de la place et de faire en sorte qu'elle ne soit pas attribuée à un autre processus. free() indique au système que tu « libères » cette place, donc que tu la lui rends. Le système en prend bonne note et l'utilisera ultérieurement s'il en a besoin mais, tant que ce n'est pas le cas, la mémoire restera exactement dans l'état dans lequel tu l'as laissée.

    C'est pour cela que les printf() que tu fais juste après tes free() ont l'air de bien fonctionner. Mais à ce stade, c'est complètement aléatoire. Si le système a écrit d'autres choses dedans, il est possible que printf ne trouve plus le « \0 » final de ta chaîne et continue trop loin, d'où les caractères étranges que tu as vus. Si, ensuite, printf ne trouve pas de terminateur avant la fin du segment accordé à ton processus ou si le système a fait le ménage et a rétréci la taille globale de la mémoire qui lui est alloué, alors tu vas déclencher une segmentation fault.

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

Discussions similaires

  1. besoin d'eclaircissement sur malloc et free
    Par Jackyzgood dans le forum C
    Réponses: 8
    Dernier message: 08/02/2010, 16h40
  2. malloc et free pour une liste de 504 bytes
    Par le mage tophinus dans le forum Langage
    Réponses: 2
    Dernier message: 30/10/2008, 11h22
  3. malloc et free en C
    Par aymeric2k dans le forum Bibliothèque standard
    Réponses: 9
    Dernier message: 09/12/2007, 18h04
  4. malloc et free
    Par petdelascar dans le forum C
    Réponses: 6
    Dernier message: 15/01/2006, 21h08
  5. malloc et free
    Par barthelv dans le forum C
    Réponses: 3
    Dernier message: 22/07/2003, 18h34

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