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

  1. #1
    Candidat au 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
    Points : 3
    Points
    3
    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

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Bonjour et bienvenue,

    À vue de nez (je n'ai que survolé), ton code a l'air syntaxiquement propre.

    Sur le fond, à présent, on utilise free() et pas FREE() (le C est case-sensitive) et d'une manière générale, essaie d'éviter le recours aux variables globales chaque fois que tu le peux (voir ici pourquoi).

    Enfin, méfie-toi lorsque tu fais des free() successifs sur M et temp. Si tu essaies de libérer une zone qui a déjà été libérée auparavant (mais dont l'adresse est restée intacte dans un pointeur qui la contient), free() va se plaindre et ton programme va planter.

  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
    1- Une variante pour le cas 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
    void * reallocM(int ** ptr, size_t n) {
        int *temp = realloc(*ptr,n*sizeof **ptr); 
        if(temp!=NULL) *ptr = temp;
        return temp;   
    } 
    // Note :  sizeof est un opérateur, pas une fonction : les () sont inutiles
    // l'opérande est une expression ou un type spécifié avec la même syntaxe que celle utilisée pour un cast (type entre ())
     
    int main(void) {
    ....
            if(reallocM(&M, n[i])!=NULL)
                printf(" Realloc OK (Taille: % 8u, Adr: %p); ", n[i]*sizeof(M),M);
            else {...
    2- Une critique sur la macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define FREE(p) free(p);\
                    p = NULL;
    Ici, tout se passe bien, mais cette macro dépend de son environnement d'utilisation ce qui est source de problèmes si on l'utilise dans un autre contexte. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(...) FREE(p);
    else ....   // erreur de compilation.
    qui va donner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(...)free(p);
    p=NULL;;    // deux ';' ce qui n'est pas bien grave
    else ....   // mais pas de if pour cet else : erreur de compilation.
    Il faut préférer, par exemple, la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define FREE(p) free(p), p = NULL
    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
    Candidat au 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
    Points : 3
    Points
    3
    Par défaut
    Merci pour vos retours.

    J'ai bien noté la subtilité sur la macro FREE(p)

    Sinon une dernière petite chose. Si je ne me trompe pas, les test sur les pointeurs avant libération sont inutiles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        if(M!=NULL)
            FREE(M);
     
        if(temp!=NULL)
            FREE(temp);
    on peut directement faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            FREE(M);
            FREE(temp);
    Non ?

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    on peut directement faire
    Tout à fait. En C, il est permis de faire un free sur NULL.

  6. #6
    Candidat au 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
    Points : 3
    Points
    3
    Par défaut
    OK, merci.

  7. #7
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    Une derniere remarque sur la macro : si tu veux vraiment en ecrire une, tu peux utiliser l'ecriture suivante (pour les memes raisons que precisees plus haut), ce qui te permet d'ecrire une macro sur plusieurs lignes sans soucis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #define FREE(p) do { /* ici le corps de ta macro
                          * sur plusieurs lignes
                          */
                       } while (0)
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  8. #8
    Candidat au 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
    Points : 3
    Points
    3
    Par défaut
    Je comprends, merci.

  9. #9
    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
    Citation Envoyé par jeroman Voir le message
    Tout à fait. En C, il est permis de faire un free sur NULL.
    attention, ceci n'est pas valable partout .... (certaines plateforme, certaines versions)...

    HPUX 10.2 et Linux Redhat 6.3 crashaient...

    De plus, de façon à être plus lisible et cohérent en général moi je conseille néanmoins de le mettre :

    de la même manière qu'on fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( (fich = fopen....) != NULL )
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( fgets(...) != NULL )
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( (x = malloc (...)) != NULL )
    je conseillerais plutôt de mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( pointeur != NULL )
    qui de plus est cohérent avec la libération de tableaux à N dimensions dans lequel on a pas (pu) par exemple tout allouer...
    "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

  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
    Envoyé par jeroman
    Tout à fait. En C, il est permis de faire un free sur NULL.
    attention, ceci n'est pas valable partout .... (certaines plateforme, certaines versions)...
    Si le compilateur respecte la norme, c'est valable.

    n1256 :
    7.20.3.2 The free function
    Synopsis
    1 #include <stdlib.h>
    void free(void *ptr);
    Description
    2 The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation. If ptr is a null pointer, no action occurs....
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    attention, ceci n'est pas valable partout .... (certaines plateforme, certaines versions)...
    Les normes C90 & C99 sont pourtant précises à ce sujet :

    7.10.3.2 The free function

    Synopsis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include        <stdlib.h> 
    void      free(void  *ptr);
    Description

    The free function causes the space pointed to by ptr to be deallocated, that is, made
    available for further allocation. If ptr is a null pointer, no action occurs. Otherwise, if the
    argument does not match a pointer earlier returned by the calloc, malloc, or realloc
    function, or if the space has been deallocated by a call to free or reallot, the behavior is
    undefined.

  12. #12
    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
    Citation Envoyé par diogene Voir le message
    Si le compilateur respecte la norme, c'est valable.
    n1256 :
    Citation Envoyé par jeroman Voir le message
    Les normes C90 & C99 sont pourtant précises à ce sujet :
    les normes et la pratique.... vaste sujet...
    "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

+ 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