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 :

calloc / realloc / free


Sujet :

Bibliothèque standard C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 79
    Par défaut calloc / realloc / free
    Bonjour, j'ai un pb et je ne vois pas ou

    je calloc une matrice :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	double **mat = (double**)calloc(20, sizeof(double*));
     
    	for (i = 0; i < 20; i++){
     
    		mat[i] = (double*)calloc(3, sizeof(double));
     
    	}
    en cours de programme je la realloc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mat = (double**)realloc(mat, 10*sizeof(double*));
    j'ai aussi essayé de la realloc comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (i = 10; i < 20; i++){
    free(mat[i]);
    }
    mat = (double**)realloc(mat, 10*sizeof(double*));
    puis en fin de programme je la free :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for (i = 0; i < 10; i++){
     
    		free(mat[i]);
     
    	}
     
    	free(mat);
    Le probleme c'est qu'un coup l'execution se passe bien et de temps en temps ca plante, si je commente le free ca passe tout le temps
    Le free m'a l'air bien, je pense que je realloc mal, mais je ne vois pas l'erreur
    please help me

  2. #2
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    bonjour,

    quelques remarques qui peut etre te feront avancer

    1°) on peux faire un realloc de taille plus petite que la taille d origine ?
    - est ce utile ? (on peux pas remettre a zero et utiliser que les 10 premiers indices)
    - que deviennent les pointeur dont on perd l adresse (les 10 derniers ici) ?
    - soit, passons, apres ton realloc alloues tu bien des nouveaux pointeurs sur double comme fait avec les calloc ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 79
    Par défaut
    Citation Envoyé par BainE Voir le message
    bonjour,

    quelques remarques qui peut etre te feront avancer

    1°) on peux faire un realloc de taille plus petite que la taille d origine ?
    - est ce utile ? (on peux pas remettre a zero et utiliser que les 10 premiers indices)
    - que deviennent les pointeur dont on perd l adresse (les 10 derniers ici) ?
    - soit, passons, apres ton realloc alloues tu bien des nouveaux pointeurs sur double comme fait avec les calloc ?
    Je te remercie de ces quelques reflexions mais je n'avance pas sur mon probleme

  4. #4
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    bon et en essayant ca ?
    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
     
    double **mat = (double**)calloc(20, sizeof(double*));
     
    for (i = 0; i < 20; i++){ 
        mat[i] = (double*)calloc(3, sizeof(double));
    }
     
    /* traitement puis liberation */
     
    for (i = 0; i < 20; i++){ 
        free(mat[i]);
    }
    free(mat);
    mat = NULL;
     
    /* reallocation */
    mat = (double**)calloc(10, sizeof(double*));
     
    for (i = 0; i < 10; i++){ 
        mat[i] = (double*)calloc(3, sizeof(double));
    }
     
    /* re traitement puis re liberation */
     
    for (i = 0; i < 10; i++){ 
        free(mat[i]);
    }
    free(mat);
    mat = NULL;
    ??

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 79
    Par défaut
    Citation Envoyé par BainE Voir le message
    bon et en essayant ca ?
    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
     
    double **mat = (double**)calloc(20, sizeof(double*));
     
    for (i = 0; i < 20; i++){ 
        mat[i] = (double*)calloc(3, sizeof(double));
    }
     
    /* traitement puis liberation */
     
    for (i = 0; i < 20; i++){ 
        free(mat[i]);
    }
    free(mat);
    mat = NULL;
     
    /* reallocation */
    mat = (double**)calloc(10, sizeof(double*));
     
    for (i = 0; i < 10; i++){ 
        mat[i] = (double*)calloc(3, sizeof(double));
    }
     
    /* re traitement puis re liberation */
     
    for (i = 0; i < 10; i++){ 
        free(mat[i]);
    }
    free(mat);
    mat = NULL;
    ??
    j'ai pas essaye mais ton "/* traitement puis liberation * /" vide entierment mat alors que moi j'ai une mat de 20 lignes, je veux garder les 10 premieres et vider la mémoire de 10 a 20

  6. #6
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par ninours23
    j'ai pas essaye mais ton "/* traitement puis liberation * /" vide entierment mat alors que moi j'ai une mat de 20 lignes, je veux garder les 10 premieres et vider la mémoire de 10 a 20
    Pourrais-tu montrer le reste de ton code? Il se pourrait que le problème soit ailleurs...

  7. #7
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par ninours23 Voir le message
    Le probleme c'est qu'un coup l'execution se passe bien et de temps en temps ca plante, si je commente le free ca passe tout le temps
    Le free m'a l'air bien, je pense que je realloc mal, mais je ne vois pas l'erreur
    please help me
    Pourrais-tu poster le reste de ton code?

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par ninours23 Voir le message
    Bonjour, j'ai un pb et je ne vois pas ou

    en cours de programme je la realloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mat = (double**)realloc(mat, 10*sizeof(double*));
    OK. Le code ayant l'air correct, je mets en œuvre mon contrôle de mémoire :

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module SYSALLOC

    Pas bon :
    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
     
    Usage xxx[ /T][ /E][ /O][ <options application>]
    FRMWRK.DBG_SYSALLOC=1
    SYSALLOC Overload (1365 rec)
    SYSALLOC Successful initialization: 1365 records available
    done in 0 s
    SYSALLOC min=4294967295 max=4294967295 delta=0
    SYSALLOC Err: Not-matched list:
    SYSALLOC Bloc 00261128 (24 bytes) calloc'ed at line 18 of 'C:\dev\mem\main.c' no
    t freed
    SYSALLOC Bloc 00261148 (24 bytes) calloc'ed at line 18 of 'C:\dev\mem\main.c' no
    t freed
    SYSALLOC Bloc 00261168 (24 bytes) calloc'ed at line 18 of 'C:\dev\mem\main.c' no
    t freed
    SYSALLOC Bloc 00261188 (24 bytes) calloc'ed at line 18 of 'C:\dev\mem\main.c' no
    t freed
    SYSALLOC Bloc 002611A8 (24 bytes) calloc'ed at line 18 of 'C:\dev\mem\main.c' no
    t freed
    SYSALLOC Bloc 002611C8 (24 bytes) calloc'ed at line 18 of 'C:\dev\mem\main.c' no
    t freed
    SYSALLOC Bloc 002611E8 (24 bytes) calloc'ed at line 18 of 'C:\dev\mem\main.c' no
    t freed
    SYSALLOC Bloc 00261208 (24 bytes) calloc'ed at line 18 of 'C:\dev\mem\main.c' no
    t freed
    SYSALLOC Bloc 002807E0 (24 bytes) calloc'ed at line 18 of 'C:\dev\mem\main.c' no
    t freed
    SYSALLOC Bloc 00280800 (24 bytes) calloc'ed at line 18 of 'C:\dev\mem\main.c' no
    t freed
    SYSALLOC Released Memory
    FRMWRK.Execution terminated
     
    Process returned 0 (0x0)   execution time : 0.036 s
    Press any key to continue.
    j'ai aussi essayé de la realloc comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (i = 10; i < 20; i++){
    free(mat[i]);
    }
    mat = (double**)realloc(mat, 10*sizeof(double*));
    C'est mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Usage xxx[ /T][ /E][ /O][ <options application>]
    FRMWRK.DBG_SYSALLOC=1
    SYSALLOC Overload (1365 rec)
    SYSALLOC Successful initialization: 1365 records available
    done in 0 s
    SYSALLOC min=4294967295 max=4294967295 delta=0
    SYSALLOC All-matched
    SYSALLOC Released Memory
    FRMWRK.Execution terminated
     
    Process returned 0 (0x0)   execution time : 0.051 s
    Press any key to continue.
    Le probleme c'est qu'un coup l'execution se passe bien et de temps en temps ca plante, si je commente le free ca passe tout le temps
    Le free m'a l'air bien, je pense que je realloc mal, mais je ne vois pas l'erreur
    please help me
    Essayons en mode debug :
    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
     
    Usage xxx[ /T][ /E][ /O][ <options application>]
    FRMWRK.DBG_SYSALLOC=1
    SYSALLOC Overload (1365 rec)
    SYSALLOC Successful initialization: 1365 records available
    SYSALLOC 'M 002A0F10     16 4294967295   88:C:\clib\ed\src\chro.c'
    SYSALLOC 'C 002A0FA8     80 4294967295   13:C:\dev\mem\main.c'
    SYSALLOC 'C 002A1000     24 4294967295   18:C:\dev\mem\main.c'
    SYSALLOC 'C 002A1020     24 4294967295   18:C:\dev\mem\main.c'
    SYSALLOC 'C 002A1040     24 4294967295   18:C:\dev\mem\main.c'
    SYSALLOC 'C 002A1060     24 4294967295   18:C:\dev\mem\main.c'
    SYSALLOC 'C 002A1080     24 4294967295   18:C:\dev\mem\main.c'
    SYSALLOC 'C 002A10A0     24 4294967295   18:C:\dev\mem\main.c'
    SYSALLOC 'C 002A10C0     24 4294967295   18:C:\dev\mem\main.c'
    SYSALLOC 'C 002A10E0     24 4294967295   18:C:\dev\mem\main.c'
    SYSALLOC 'C 002A1100     24 4294967295   18:C:\dev\mem\main.c'
    SYSALLOC 'C 002A1120     24 4294967295   18:C:\dev\mem\main.c'
    SYSALLOC 'C 002A1140     24 4294967295   18:C:\dev\mem\main.c'
    SYSALLOC 'C 002A1160     24 4294967295   18:C:\dev\mem\main.c'
    SYSALLOC 'C 002A1180     24 4294967295   18:C:\dev\mem\main.c'
    SYSALLOC 'C 002A11A0     24 4294967295   18:C:\dev\mem\main.c'
    SYSALLOC 'C 002A11C0     24 4294967295   18:C:\dev\mem\main.c'
    SYSALLOC 'C 002A11E0     24 4294967295   18:C:\dev\mem\main.c'
    SYSALLOC 'C 002A1200     24 4294967295   18:C:\dev\mem\main.c'
    SYSALLOC 'C 002A1220     24 4294967295   18:C:\dev\mem\main.c'
    SYSALLOC 'C 002C07E0     24 4294967295   18:C:\dev\mem\main.c'
    SYSALLOC 'C 002C0800     24 4294967295   18:C:\dev\mem\main.c'
    SYSALLOC 'F 002A1140      0 4294967295   29:C:\dev\mem\main.c'
    SYSALLOC 002A1140 matched
    SYSALLOC 'F 002A1160      0 4294967295   29:C:\dev\mem\main.c'
    SYSALLOC 002A1160 matched
    SYSALLOC 'F 002A1180      0 4294967295   29:C:\dev\mem\main.c'
    SYSALLOC 002A1180 matched
    SYSALLOC 'F 002A11A0      0 4294967295   29:C:\dev\mem\main.c'
    SYSALLOC 002A11A0 matched
    SYSALLOC 'F 002A11C0      0 4294967295   29:C:\dev\mem\main.c'
    SYSALLOC 002A11C0 matched
    SYSALLOC 'F 002A11E0      0 4294967295   29:C:\dev\mem\main.c'
    SYSALLOC 002A11E0 matched
    SYSALLOC 'F 002A1200      0 4294967295   29:C:\dev\mem\main.c'
    SYSALLOC 002A1200 matched
    SYSALLOC 'F 002A1220      0 4294967295   29:C:\dev\mem\main.c'
    SYSALLOC 002A1220 matched
    SYSALLOC 'F 002C07E0      0 4294967295   29:C:\dev\mem\main.c'
    SYSALLOC 002C07E0 matched
    SYSALLOC 'F 002C0800      0 4294967295   29:C:\dev\mem\main.c'
    SYSALLOC 002C0800 matched
    SYSALLOC 'F 002A0FA8     40 4294967295   31:C:\dev\mem\main.c'
    SYSALLOC 002A0FA8 matched
    SYSALLOC 'R 002A0FA8     40 4294967295   31:C:\dev\mem\main.c'
    SYSALLOC 'F 002A1000      0 4294967295   38:C:\dev\mem\main.c'
    SYSALLOC 002A1000 matched
    SYSALLOC 'F 002A1020      0 4294967295   38:C:\dev\mem\main.c'
    SYSALLOC 002A1020 matched
    SYSALLOC 'F 002A1040      0 4294967295   38:C:\dev\mem\main.c'
    SYSALLOC 002A1040 matched
    SYSALLOC 'F 002A1060      0 4294967295   38:C:\dev\mem\main.c'
    SYSALLOC 002A1060 matched
    SYSALLOC 'F 002A1080      0 4294967295   38:C:\dev\mem\main.c'
    SYSALLOC 002A1080 matched
    SYSALLOC 'F 002A10A0      0 4294967295   38:C:\dev\mem\main.c'
    SYSALLOC 002A10A0 matched
    SYSALLOC 'F 002A10C0      0 4294967295   38:C:\dev\mem\main.c'
    SYSALLOC 002A10C0 matched
    SYSALLOC 'F 002A10E0      0 4294967295   38:C:\dev\mem\main.c'
    SYSALLOC 002A10E0 matched
    SYSALLOC 'F 002A1100      0 4294967295   38:C:\dev\mem\main.c'
    SYSALLOC 002A1100 matched
    SYSALLOC 'F 002A1120      0 4294967295   38:C:\dev\mem\main.c'
    SYSALLOC 002A1120 matched
    SYSALLOC 'F 002A0FA8      0 4294967295   42:C:\dev\mem\main.c'
    SYSALLOC 002A0FA8 matched
    done in 0.065 s
    SYSALLOC 'F 002A0F10      0 4294967295  114:C:\clib\ed\src\chro.c'
    SYSALLOC 002A0F10 matched
    SYSALLOC min=4294967295 max=4294967295 delta=0
    SYSALLOC All-matched
    SYSALLOC Released Memory
    FRMWRK.Execution terminated
     
    Process returned 0 (0x0)   execution time : 0.099 s
    Press any key to continue.
    Est-ce que les tailles allouées sont correctes ?

    Apparement, oui, comme le confirme les résultats sur ce code :
    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
     
    #include <stdlib.h>
     
    int main (void)
    {
       int i;
     
       double **mat = calloc (20, sizeof *mat);
     
       for (i = 0; i < 20; i++)
       {
          mat[i] = calloc (3, sizeof *mat[i]);
       }
     
    #if 0
       mat = realloc (mat, 10 * sizeof *mat);
    #else
       for (i = 10; i < 20; i++)
       {
          free (mat[i]);
       }
       mat = realloc (mat, 10 * sizeof *mat);
    #endif
     
       for (i = 0; i < 10; i++)
       {
          free (mat[i]);
       }
       free (mat);
     
       return 0;
    }
    Le problème est donc ailleurs.

Discussions similaires

  1. Recoder malloc, free, mallopt, realloc
    Par Onche dans le forum Débuter
    Réponses: 1
    Dernier message: 05/12/2013, 20h47
  2. Probleme avec realloc et free
    Par DrakaSAN dans le forum Débuter
    Réponses: 19
    Dernier message: 10/07/2012, 12h31
  3. Embrouille avec les malloc / calloc / realloc
    Par titimoi dans le forum Débuter
    Réponses: 16
    Dernier message: 12/03/2009, 16h53
  4. malloc calloc realloc free
    Par lia20 dans le forum C
    Réponses: 7
    Dernier message: 26/05/2007, 15h22
  5. realloc, free ou pas free ?
    Par kamouminator dans le forum C
    Réponses: 7
    Dernier message: 10/11/2006, 21h48

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