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 :

(Re)Allocation dynamique de mémoire dans une fonction


Sujet :

C

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Defender of Freedom !
    Inscrit en
    Juin 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Defender of Freedom !

    Informations forums :
    Inscription : Juin 2007
    Messages : 4
    Par défaut (Re)Allocation dynamique de mémoire dans une fonction
    Bonjour,

    après recherche et lecture d'informations, j'effectue quelques tests sur un cas "simple" afin de bien comprendre l'allocation et la libération de mémoire avec fonction

    Je cherche juste à modifier la taille d'un tableau d'entiers dans 4 codes différents comme ceci :

    • realloc-1.c : realloc dans la fonction principale + variable locale
    • realloc-2.c : realloc dans la fonction principale + variable globale
    • realloc-3.c : realloc dans une sous-fonction + variable globale
    • realloc-4.c : realloc dans une sous-fonction + passage par adresse


    Tous les codes semblent tourner sans erreur mais je voulais avoir confirmation auprès de membres plus expérimentés. Ces codes sont-ils propres ?

    Le but final étant bien entendu d'utiliser la dernière méthode, donc si vous pouviez au moins me donner votre avis sur cette version...

    PS : ne vous attardez pas trop sur les fonctions disp et setvalk (sauf erreur flagrante).

    Merci
    Stupendous Man (autodidacte)

    realloc-1.c :
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    #include "rea.h"
     
    int disp(int *, size_t);
    int setvalk(int *, size_t);
     
    int main(void) {
     
        int chk;
        int *M = NULL, *temp = NULL;
        size_t n[4], i;
     
        n[0] = (size_t)N0;
        n[1] = n[0]*800;
        n[2] = n[1]/400;
        n[3] = n[2]*1000;
     
        printf("\nDebut\n\n");
     
        for(i=0;i<4;i++) {
     
            temp = realloc(M, n[i]*sizeof(M));
            if(temp==NULL) {
                fprintf(stderr, " Pb Realloc (%s - %u)", __FILE__, __LINE__);
                if(i>0)
                    FREE(M);
                return -1;
            }
            else {
                M = temp;
                temp = NULL;
                printf(" Realloc OK (Taille: % 8u, Adr: %p); ", n[i]*sizeof(M),M);
            }
     
            chk = setvalk(M, n[i]); 
            printf("%s",(chk==0) ? "Setvalk OK;\n" : "Pb Setvalk;\n");
            if(chk==-1)
                break;
     
            chk = disp(M, n[i]);
            printf("%s",(chk==0) ? "Affiche OK; " : "Pb Affiche;");
            if(chk==-1)
                break;
     
            printf("\n\n");   
     
        }
     
        if(M!=NULL)
            FREE(M);
     
        if(temp!=NULL)
            FREE(temp);
     
        printf("\nFin\n");
     
        return 0;
     
    }
     
    int disp(int * ptr, size_t n) {
     
        size_t i;
     
        printf(" M (Adr: %p) = [ ", ptr);
     
        if(n>AFFMAX) {
            for(i=0;i<AFFMAX;i++)
                printf("%d ", ptr[i]);
            printf("...]; ");
        }
        else {
            for(i=0;i<n;i++)
                printf("%d ", ptr[i]);
            printf("];");
            for(i=0;i<2*(AFFMAX-n+2);i++)
                printf(" ");
        }
     
        return 0;
     
    }
     
    int setvalk(int * ptr, size_t n) {
     
        size_t i;
     
        for(i=0;i<n;i++)
            ptr[i] = k;
     
        k++;
     
        return 0;
     
    }
    realloc-2.c :
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    #include "rea.h"
     
    int disp(size_t);
    int setvalk(size_t);
     
    int *M = NULL;
     
    int main(void) {
     
        int chk;
        int *temp = NULL;
        size_t n[4], i;
     
        n[0] = (size_t)N0;
        n[1] = n[0]*800;
        n[2] = n[1]/400;
        n[3] = n[2]*1000;
     
        printf("\nDebut\n\n");
     
        for(i=0;i<4;i++) {
     
            temp = realloc(M, n[i]*sizeof(M));
            if(temp==NULL) {
                fprintf(stderr, " Pb Realloc (%s - %u)", __FILE__, __LINE__);
                if(i>0)
                    FREE(M);
                return -1;
            }
            else {
                M = temp;
                temp = NULL;
                printf(" Realloc OK (Taille: % 8u, Adr: %p); ", n[i]*sizeof(M),M);
            }
     
            chk = setvalk(n[i]); 
            printf("%s",(chk==0) ? "Setvalk OK;\n" : "Pb Setvalk;\n");
            if(chk==-1)
                break;
     
            chk = disp(n[i]);
            printf("%s",(chk==0) ? "Affiche OK; " : "Pb Affiche;");
            if(chk==-1)
                break;
     
            printf("\n\n");   
     
        }
     
        if(M!=NULL)
            FREE(M);
     
        if(temp!=NULL)
            FREE(temp);
     
        printf("\nFin\n");
     
        return 0;
     
    }
     
    int disp(size_t n) {
     
        size_t i;
     
        printf(" M (Adr: %p) = [ ", M);
     
        if(n>AFFMAX) {
            for(i=0;i<AFFMAX;i++)
                printf("%d ", M[i]);
            printf("...]; ");
        }
        else {
            for(i=0;i<n;i++)
                printf("%d ", M[i]);
            printf("];");
            for(i=0;i<2*(AFFMAX-n+2);i++)
                printf(" ");
        }
     
        return 0;
     
    }
     
    int setvalk(size_t n) {
     
        size_t i;
     
        for(i=0;i<n;i++)
            M[i] = k;
     
        k++;
     
        return 0;
     
    }
    realloc-3.c :
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    #include "rea.h"
     
    int disp(size_t);
    int setvalk(size_t);
    int reallocM(size_t);
     
    int *M = NULL;
     
    int main(void) {
     
        int chk;
        size_t n[4], i;
     
        n[0] = N0;
        n[1] = n[0]*800;
        n[2] = n[1]/400;
        n[3] = n[2]*1000;
     
        printf("\nDebut\n\n");
     
        for(i=0;i<4;i++) {
     
            chk = reallocM(n[i]);
            if(chk==0)
                printf(" Realloc OK (Taille: % 8u, Adr: %p); ", n[i]*sizeof(M),M);
            else {
                fprintf(stderr, " Pb Realloc (%s - %u)", __FILE__, __LINE__);
                if(i>0)
                    FREE(M);
                return -1;
            }
     
            chk = setvalk(n[i]); 
            printf("%s",(chk==0) ? "Setvalk OK;\n" : "Pb Setvalk;\n");
            if(chk==-1)
                break;
     
            chk = disp(n[i]);
            printf("%s",(chk==0) ? "Affiche OK; " : "Pb Affiche;");
            if(chk==-1)
                break;
     
            printf("\n\n");   
     
        }
     
        if(M!=NULL)
            FREE(M);
     
        printf("\nFin\n");
     
        return 0;
     
    }
     
    int disp(size_t n) {
     
        size_t i;
     
        printf(" M (Adr: %p) = [ ", M);
     
        if(n>AFFMAX) {
            for(i=0;i<AFFMAX;i++)
                printf("%d ", M[i]);
            printf("...]; ");
        }
        else {
            for(i=0;i<n;i++)
                printf("%d ", M[i]);
            printf("];");
            for(i=0;i<2*(AFFMAX-n+2);i++)
                printf(" ");
        }
     
        return 0;
     
    }
     
    int setvalk(size_t n) {
     
        size_t i;
     
        for(i=0;i<n;i++)
            M[i] = k;
     
        k++;
     
        return 0;
     
    }
     
    int reallocM(size_t n) {
     
        int *temp=NULL;
     
        temp = realloc(M,n*sizeof(*M));
        if(temp==NULL) {
            if(M!=NULL)
                FREE(M);
            return -1;
        }
        else {
            M = temp;
            temp = NULL;
        }
     
        return 0;
     
    }
    realloc-4.c :
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    #include "rea.h"
     
    int disp(int *, size_t);
    int setvalk(int *, size_t);
    int reallocM(int **, size_t);
     
    int main(void) {
     
        int *M = NULL;
        int chk;
        size_t n[4], i;
     
        n[0] = N0;
        n[1] = n[0]*800;
        n[2] = n[1]/400;
        n[3] = n[2]*1000;
     
        printf("\nDebut\n\n");
     
        for(i=0;i<4;i++) {
     
            chk = reallocM(&M, n[i]);
            if(chk==0)
                printf(" Realloc OK (Taille: % 8u, Adr: %p); ", n[i]*sizeof(M),M);
            else {
                fprintf(stderr, " Pb Realloc (%s - %u)", __FILE__, __LINE__);
                if(i>0)
                    FREE(M);
                return -1;
            }
     
            chk = setvalk(M, n[i]); 
            printf("%s",(chk==0) ? "Setvalk OK;\n" : "Pb Setvalk;\n");
            if(chk==-1)
                break;
     
            chk = disp(M, n[i]);
            printf("%s",(chk==0) ? "Affiche OK; " : "Pb Affiche;");
            if(chk==-1)
                break;
     
            printf("\n\n");   
     
        }
     
        if(M!=NULL)
            FREE(M);
     
        printf("\nFin\n");
     
        return 0;
     
    }
     
    int disp(int * ptr, size_t n) {
     
        size_t i;
     
        printf(" M (Adr: %p) = [ ", ptr);
     
        if(n>AFFMAX) {
            for(i=0;i<AFFMAX;i++)
                printf("%d ", ptr[i]);
            printf("...]; ");
        }
        else {
            for(i=0;i<n;i++)
                printf("%d ", ptr[i]);
            printf("];");
            for(i=0;i<2*(AFFMAX-n+2);i++)
                printf(" ");
        }
     
        return 0;
     
    }
     
    int setvalk(int * ptr, size_t n) {
     
        size_t i;
     
        for(i=0;i<n;i++)
            ptr[i] = k;
     
        k++;
     
        return 0;
     
    }
     
    int reallocM(int ** ptr, size_t n) {
     
        int *temp=NULL;
     
        temp = realloc(*ptr,n*sizeof(**ptr));
        if(temp==NULL) {
            return -1;
        }
        else {
            *ptr = temp;
            temp = NULL;
        }
     
        return 0;
     
    }
    rea.h :
    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
    #ifndef H_REA
    #define H_REA
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #define N0 200
     
    #define AFFMAX 9
     
    #define FREE(p) free(p);\
                    p = NULL;
     
    int k = 0;
     
    #endif
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. Problème de libération de la mémoire dans une fonction
    Par ArnaudFu1 dans le forum Débuter
    Réponses: 2
    Dernier message: 23/02/2012, 16h21
  2. Fuite mémoire dans une fonction
    Par medkyl dans le forum Débuter
    Réponses: 7
    Dernier message: 30/12/2009, 16h19
  3. Réponses: 3
    Dernier message: 20/09/2009, 17h40
  4. [D5] Créer dynamiquement des variables dans une fonction
    Par MelkInarian dans le forum Delphi
    Réponses: 11
    Dernier message: 14/04/2007, 12h16
  5. Réponses: 6
    Dernier message: 03/02/2006, 19h45

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