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 :

test d'une allocation dynamique de mémoire


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 24
    Points : 11
    Points
    11
    Par défaut test d'une allocation dynamique de mémoire
    Bonjour;

    Je dispose de 4 tablaux à N élement et je veux tester que ma mémoire a bien été alloué dynamiquement, pr cela je fais :

    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
     
    int *A=NULL,*B=NULL,*C=NULL,*D=NULL;
     
                 A=malloc((N)* sizeof(int));
     
    	B=malloc((N)* sizeof(int));
     
    	C=malloc((N)* sizeof(int));
     
    	D=malloc((N)* sizeof(int));
     
    	// test si la mémoire a bien été alloué manuellement
     
    	if ( (A == NULL || B == NULL) || ( C==NULL || D==NULL) )
        {
            exit(0);
        }
    Par ailleur je dispose egalement d une matrice mat[M][N], et j aimerai effectuer le meme test, mais je ne vois pas comment faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int **mat=NULL;
    int i;
    mat=malloc(M *sizeof(int*)); 
     
    	for (i = 0; i < M ; i++)
    	{
    	mat[i] =malloc(N * sizeof(int));
    	}
    Merci d'avance

  2. #2
    Membre actif
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Points : 216
    Points
    216
    Par défaut
    salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	if ( (A == NULL || B == NULL) || ( C==NULL || D==NULL) )
    Tes parenthèses internes sont inutiles et nuisent à la lisibilité, mais ce n'est qu'un détail.


    Ensuite pour ton souci, ben je ne vois pas trop de problème :

    D'abord tu vérifies si mat a bien été alloué (if (mat != NULL) ) (avant ta boucle for ! )


    puis , au choix, tu peux vérifier juste après le malloc dans le for si mat[i] a bien été alloué, ou alors refaire une deuxième boucle pour vérifier tous les mat[i].

    Par contre sortir brutalement du programme n'est pas très efficace pour le débuggage, fait au moins un printf pour indiquer où et quoi a posé problème .

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int **mat=NULL;
    int i;
    mat=malloc(M *sizeof(int*)); 
    if(mat != NULL)	
    	for (i = 0; i < M ; i++)
    	{
    	mat[i] =malloc(N * sizeof(int));
            if(mat[i] == NULL) exit(0);
    	}
    else exit(0);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Merci,
    Ma question était un peu bete, j'avais pas pensé a raison ainsi !

    Une derniere chose : qd on fait un alloc dynamique de mémoire est il vraiment necessaire de liberer de l espace memoire à la fin du programme avec la fction free ? Ou bien qu'une fois le programme terminé l'espace est liberer par lui meme ?

    Merci encore

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par gotrunkssj Voir le message
    Merci,
    Ma question était un peu bete, j'avais pas pensé a raison ainsi !

    Une derniere chose : qd on fait un alloc dynamique de mémoire est il vraiment necessaire de liberer de l espace memoire à la fin du programme avec la fction free ? Ou bien qu'une fois le programme terminé l'espace est liberer par lui meme ?

    Merci encore
    Une fois que le processus se termine l'espace est automatiquement libéré;
    mais il est conseillé de s'habituer à libérer l'espace avec free() ;
    car un jour on verra un petit "memory leak" (rarement dans les petits programmes, mais comme j'ai dit, il faut apprendre les bonnes habitudes) http://en.wikipedia.org/wiki/Memory_...mple_C_example

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Avec tes exemples, cela donne :

    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
    int *A=NULL,*B=NULL,*C=NULL,*D=NULL;
    
                 A=malloc((N)* sizeof(int));
    	B=malloc((N)* sizeof(int));
    	C=malloc((N)* sizeof(int));
    	D=malloc((N)* sizeof(int));
    
    	// test si la mémoire a bien été alloué manuellement
    	
    	if ( (A == NULL) || (B == NULL) || (C==NULL) || (D==NULL) )
                  {
                     /* Si possible les mettrre en sens inverse de l'allocation (pour tenter de VRAIMENT libérer la mémoire) */
                     if ( D != NULL )
                       free (D);
                     if ( C != NULL )
                       free (C);
                     if ( B != NULL )
                       free (B);
                     if ( A != NULL )
                       free (A);
                     exit(0);
                  }

    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
    int **mat=NULL;
    int i, j;
    mat=malloc(M *sizeof(int*)); 
    if(mat != NULL)
      {
         for (i = 0; i < M ; i++)
            {
               mat[i] =malloc(N * sizeof(int));
               if(mat[i] == NULL) 
                 {
                    if ( i != 0 )
                       for ( j = (i-1) ; j >= 0 ; j-- )
                          free ( mat[j]);
    
                     exit(0);
                 }
            }
      }
    else 
         exit(0);
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 24
    Points : 11
    Points
    11
    Par défaut
    Est ce faux de faire ainsi a la fin du programme !?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    free(*mat);
     
    for(i=0;i<M;i++)
           free(mat[i]);

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    oui parce que tu libères mat avant d'avoir libérer chacun des éléments d emat...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

Discussions similaires

  1. (Re)Allocation dynamique de mémoire dans une fonction
    Par Stupendous Man dans le forum Débuter
    Réponses: 11
    Dernier message: 17/06/2011, 16h46
  2. Réponses: 3
    Dernier message: 20/09/2009, 17h40
  3. Allocation dynamique de mémoire
    Par cd090580 dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 12/11/2005, 11h17
  4. [VC++/ASM] Allocation dynamique de mémoire ?
    Par Magus (Dave) dans le forum x86 32-bits / 64-bits
    Réponses: 7
    Dernier message: 21/12/2004, 15h05
  5. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31

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