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

Bibliothèque standard C Discussion :

malloc et free en C


Sujet :

Bibliothèque standard C

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 11
    Points : 5
    Points
    5
    Par défaut malloc et free en C
    Bonjour à tous!
    J'ai un petit bout de code C qui affiche une matrice , mais je "dois" utiliser free à la fin mais ....... (je m'arrete là, je ne suis pas sur de pouvoir iben expliquer)


    Merci à vous.

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    #include<stdio.h>
    #include<stdlib.h>
     
    int** creermatrice(int lgn,int col)
    {
    	int i,j;
    	int** matrice;
    	matrice=(int**)malloc(sizeof(int*)*lgn);
     
    	for(i=0;i<lgn;i++)	
    	{
    	matrice[i]=(int*)malloc(sizeof(int*)*col);
        }
     
        for(i=0;i<lgn;i++)
        {
        	for(j=0;j<col;j++)
        	{
        		if(i==j)
        		matrice[i][j]= 1;
        		else
        		matrice[i][j]= 0;
    		}
    	}
    	return matrice;
    }
     
    void affiche(int **matrice,int lgn, int col)
    {
    	int i, j;
     
    		printf("     La matrice est :\n");
     	  for(i=0;i<lgn;i++)
     	  {
     	  	printf("\n");
     	  	for(j=0;j<col;j++)
     	  	{
     	  		printf(" %d ",matrice[i][j]);
    		}
    	}
    	printf("\n");
    }  
     
     
     
     
    int main()
    {
    	int **matrice;
    	int col,lgn;
     
     
    	printf("Entrez le nombre de lignes et de colonnes : \n");
    	scanf("%d %d",&lgn,&col);
     
    	matrice = creermatrice(lgn,col);
    	affiche(matrice,lgn,col);
     
    /* utiliser free */
     
    	return 0;
    }

  2. #2
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		for(i=0;i<taille_plateau;i++)
    	{
    		free (plateau[i]);
    	}
    	free (plateau);

    ???????????????????

  3. #3
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Une erreur à corriger:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int** creermatrice(int lgn,int col)
    ....
    for(i=0;i<lgn;i++)	
    	{
    	matrice[i]=(int*)malloc(sizeof(int)*col);
    Le code devrait vérifier que toutes les allocations ont réussies et en cas d'échec de l'une, détruire ce qui a été alloué précédemment et renvoyer NULL.
    Pour ce qui est de la libération mémoire, le mieux est d'écrire une fonction detruirematrice. Elle doit faire autant de free que creermatrice a fait de malloc: Commencer par détruire les matrice[ I], puis terminer en détruisant matrice

  4. #4
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci.

    Avant les free, j'ai utiliser plein plein de fois la fonction...
    sur des matrices relativement grosses (100000*100000) par exemple.

    J'ai donc pas mal de mémoire encore allouée, est ce qu'il y a une manip à faire maintenant que j'ai perdu les pointeurs?

    Merci.

  5. #5
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Pour une matrice, les pointeurs ne sont pas (normalement) perdus. C'est le contenu des tableaux qui a changé, pas leur adresse.
    Si tu as appelés plusieurs fois creermatrice tu as créé autant de matrice différentes et tu dois toutes les détruire.
    Si tu as perdu les pointeurs sur les matrices, il faut revoir ton code pour les détruire lorsque tu ne t'en sert plus.

  6. #6
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Oui j'ia compris, merci pour vos réponses, mais du coup, il y a toujours en mémoire mes matrices si je n'avais pas utiliser free?

  7. #7
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    du coup, il y a toujours en mémoire mes matrices si je n'avais pas utiliser free?
    bien sur. La règle quand on fait de l'allocation dynamique est de détruire les objets qui ne servent plus. Ce n'est pas la peine d'attendre la fin du programme, il vaut mieux récupérer la mémoire au plus tôt.

  8. #8
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Tu veux dire que 10jours plus tard, c'est toujours réservé sur mon ordi et c'est trop tard?

  9. #9
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Tu veux dire que 10jours plus tard, c'est toujours réservé sur mon ordi et c'est trop tard?
    Oui,
    (si ton programme tourne pendant 10 jours naturellement ce qui est possible)

  10. #10
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Avant les free, j'ai utiliser plein plein de fois la fonction...
    sur des matrices relativement grosses (100000*100000) par exemple
    Allouer des matrices d'une telle dimension sans tester les allocations est du suicide. Une seule de ces matrices occupe sans doute entre 20 et 40 Go. Il faut beaucoup de mémoire vive, sinon tout est en mémoire virtuelle et bonjour les temps de calcul (finalement, 10 jours est peut être vraisemblable )

Discussions similaires

  1. Place de malloc() et free()
    Par mikhailo dans le forum Débuter
    Réponses: 3
    Dernier message: 22/04/2010, 11h13
  2. besoin d'eclaircissement sur malloc et free
    Par Jackyzgood dans le forum C
    Réponses: 8
    Dernier message: 08/02/2010, 16h40
  3. 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
  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