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 :

Détail sur realloc.


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2014
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Détail sur realloc.
    Bonjour (bonsoir) à tous.

    J'ai une question sur la fonction realloc.
    Admettons que je fasse un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int i=0;
    int* tab = (int *) malloc(sizeof(int)*15);
     
    for{i=0;i<15;i++){
       tab[i]=i;
    }
     
    free(tab[4]);
    free(tab[9]);
    free(tab[14]);
     
    tab = realloc(tab,sizeof(int)*12);
    est-ce que realloc va reperer les zones libres les enlever et me remettre le reste dans un tableau de 12 éléments avec tab[4] = 5, tab[9]=11 et tab[12]=14, par exemple ?

    nb : j'ai conscience que le code est pas terrible est qu'il faut tester chaque allocation pour éviter les erreurs, mais dans un souci de clarté j'ai pas voulu m'encombrer avec les tests habituels.

  2. #2
    Membre chevronné
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Points : 1 753
    Points
    1 753
    Par défaut
    Bonjour
    Attention dans l'exemple poster il y a des erreurs.
    la fonction
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    void free( void* ptr );
    a pour rôle de libère l'espace mémoire pointé par votre variable pointeur et elle sera sans effet, si le variable pointeur vaut nulle en plus claire, free ne marchera qu'a condition que le variable pointeur pointe sur un espace mémoire alloué par calloc realoc ou malloc.

    Et pour répondre à ta question la fonction realloc travaille uniquement sur la taille de ton objet ( exemple tableaux) et non sur les éléments de ton objet en plus clair, il change la taille de ton objet pointé par ta variable pointeur.
    Si la nouvelle taille est plus petite que l'ancienne taille alors, la fonction conservera uniquement le début du contenu de ton objet dans le cas contraire (si la taille souhaitée est plus grande que la taille initiale ) tout le contenue de ton objet est conserver mais, les espaces supplémentaires ne sont pas initialisés c'est donc à toi de faire le nécessaire.
    Il faut également garder en tête que la fonction renvoie un pointeur sur le nouvel espace mémoire , NULL, quand tout se passe mal sinon, l'objet conserve sa taille initiale.
    à bientôt

  3. #3
    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 129
    Points
    28 129
    Par défaut
    Citation Envoyé par Faraziel Voir le message
    Admettons que je fasse un truc du genre :
    Je crains de ne pas admettre non

    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
     
    int i=0;
    int* tab = (int *) malloc(sizeof(int)*15); /* Tu alloues donc 15 "int*", donc 15 pointeurs sur des int */
     
    for{i=0;i<15;i++){
    /*   tab[i]=i; */ /* NON. Enfin c'est légal de faire ça, mais ce n'est probablement pas ce que tu veux faire. Ici, tu mets dans tab[0] l'adresse 0, qui ne t'es pas allouée, donc si tu accèdes à son contenu, tu plantes */
       tab[i] = malloc (taille); /* taille à définir */
       if (tab[i] == NULL)
         break;
    }
     
    if (i != 15)
    {
      /* au moins une allocation a planté. On libère et on quitte */
      for (j = i ; j >= 0 ; j--)
      { free tab[j] ; 
         tab[j] = NULL;
       }
       free (tab);
    }
     
    free(tab[4]);
    free(tab[9]);
    free(tab[14]);
     
    tab = realloc(tab,sizeof(int)*12);
    est-ce que realloc va reperer les zones libres les enlever et me remettre le reste dans un tableau de 12 éléments avec tab[4] = 5, tab[9]=11 et tab[12]=14, par exemple ?
    Non, car tu vois bien maintenant que tab ou tab[i] sont des allocations différentes.

    Par ailleurs, ton utilisation de realloc n'est pas bonne : si realloc ne peut réallouer, il retourne NULL, et laisse ta zone mémoire intacte, pour que tu puisses continuer à travailler. Mais si tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tab = realloc (tab, ....);
    tu perds ton pointeur sur tab, et tu as donc une fuite mémoire. La bonne manière serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int * tmp_tab;
    tmp_tab = realloc (tab, nouvelle_taille);
     
    if (tmp_tab == NULL)
    {
    /* afficher une erreur */
    }
    else
    {
    tab = tmp_tab; 
    taille_tab = nouvelle_taille ;
    }
    /* suite de ton programme */

Discussions similaires

  1. Détails sur les progress Bar
    Par nbeligh dans le forum MFC
    Réponses: 2
    Dernier message: 11/09/2006, 11h10
  2. [CRXI] Détail sur une ligne
    Par Julyon dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 21/08/2006, 14h03
  3. Réponses: 2
    Dernier message: 09/06/2006, 13h33
  4. concaténation des status d'un détail sur une ligne
    Par orafrance dans le forum Oracle
    Réponses: 11
    Dernier message: 02/06/2006, 09h13
  5. [QuickReport] Entete de groupe + détail sur la même page
    Par portu dans le forum Bases de données
    Réponses: 3
    Dernier message: 11/06/2005, 10h15

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