Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 08/11/2019, à 17:41

chris7522

Liberation memoire calloc (C)

Bonjour a toutes et a tous,
Puis-je liberer la memoire réservé avec calloc , avec un free quelque chose  ?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 200

int main(){
 int l;
 char *ch=calloc(MAX,sizeof(char));
 if(ch==NULL){
  puts("ERREUR:probleme de memoire!");
  exit(EXIT_FAILURE);
 }
 
 puts("Entrez une phrase de 200 caractere max:");
 fgets(ch,MAX, stdin);
 l=strlen(ch);

 if(l<MAX){
  FILE *f=fopen("README.TXT","w");
  if(f==NULL)
   exit(1);
  fputs(ch,f);
  fclose(f);
  }
 puts("Continuez a ecrire dans le fichier:");
 fgets(ch,MAX,stdin);
 FILE *f=fopen("README.TXT","a");
 if(f== NULL)
  exit(1);
 fputs(ch,f);
 fclose(f);
 
 return 0;
}

Merci de votre aide

Hors ligne

#2 Le 08/11/2019, à 18:47

lann

Re : Liberation memoire calloc (C)

Oui ça me semble obligatoire

free(ch)

Hors ligne

#3 Le 09/11/2019, à 10:33

chris7522

Re : Liberation memoire calloc (C)

Merci de ton aide . Donc je le place une seule fois a la fin ou apres chaque fclose ?

Hors ligne

#4 Le 09/11/2019, à 23:21

NicoApi73

Re : Liberation memoire calloc (C)

Bonsoir,

Ni l'un, ni l'autre.

Après avoir testé que ton allocation de mémoire a été faite, il faut libérer cette mémoire dès que tu sors.

 if(ch==NULL){
  puts("ERREUR:probleme de memoire!");
  exit(EXIT_FAILURE);
 }

à partir d'ici, la mémoire a été allouée et il te faut une procédure pour la libérer, soit quand tu n'en as plus besoin, soit quand tu quittes le programme.

Ta dernière utilisation de ch est à la ligne 30 ( fputs(ch,f);) donc juste après, tu peux libérer la mémoire avec free

En dehors du test pour vérifier que la mémoire est bien allouée et de la fin (return 0), tu quittes le programme en 2 autres points (exit (1)). C'est à ces moments là qu'il faut également gérer la libération de la mémoire. Il y a différentes solutions pour le faire.

AJOUT :
Si tu ne le fais qu'une fois, juste avant la fin du programme, la mémoire ne sera pas libérée si tu as un problème pour ouvrir ton fichier.
Si tu la libères à chaque fclose, dès que tu utilises de nouveau ch, ton programme à toutes les chances de planter car tu adresses à ce moment une zone dont tu ne contrôle plus l'allocation.

Dernière modification par NicoApi73 (Le 09/11/2019, à 23:27)

Hors ligne

#5 Le 10/11/2019, à 15:11

chris7522

Re : Liberation memoire calloc (C)

Merci beaucoup pour ta reponse , c'est tres clair . Est ce indispensable de gerer aussi la memoire pour les eventuelle sortie de programme exit(1) et pas seulement a la fin d'utilisation de mon ch . Les ordinateurs n'ont ils pas suffisament de memoire de nos jours ?

Hors ligne

#6 Le 10/11/2019, à 16:07

Watts

Re : Liberation memoire calloc (C)

Bonjour,

Si tu es utilisateur de programmes sur ordinateur, tu remarquera que tu n'apprécies pas un programme qui va bouffer plus de RAM que nécessaire. Libérer les pointeurs, c'est s'assurer d'une optimisation maximale de son programme, et également éviter les failles éventuelles de sécurité. C'est une bonne pratique. De plus, les programmes en C ne sont pas forcément destinés à un ordinateur classique, ils peuvent s'adresser à un micro contrôleur à quelques ko de RAM.


Acer Aspire X3990-Dual boot Windows 7 / Ubuntu 18.04

Hors ligne

#7 Le 10/11/2019, à 16:13

NicoApi73

Re : Liberation memoire calloc (C)

Oui c'est techniquement possible, mais ce n'est pas propre. Tu auras des fuites mémoire (memory leak), qui peuvent aller jusqu'à bloquer la machine. Si tu t'essaies sur de l'embarqué (par exemple avec un Arduino), déjà que les pointeurs sont évités dans ce type de programmation (parfois même interdits), si en plus tu ne libères pas la mémoire, ça peut vite devenir catastrophique.

Certains langages de programmation intègrent un garbage collector pour récupérer la mémoire qui est inutilisée, comme java ou C#. Ici, tu fais de la programmation en C...

EDIT : doublé par Watts smile

Dernière modification par NicoApi73 (Le 10/11/2019, à 16:13)

Hors ligne

#8 Le 10/11/2019, à 17:55

chris7522

Re : Liberation memoire calloc (C)

Merci a tous les deux . Je comprends maintenant la nécéssité ou plutot , l'obligation de le faire .

Hors ligne