realloc d'un tableau plus petit

realloc d'un tableau plus petit - C - Programmation

Marsh Posté le 16-08-2006 à 18:06:24    

Bonjour,
 
 
j'aimerais savoir si realloc est utile pour diminuer la taille d'un tableau alloué dynamiquement. Plus précisemment, si par exemple j'ai un tableau de valeurs TAB de taille 5 qui est
 

Code :
  1. 1 2 3 4 5


 
est ce que si je fais
 

Code :
  1. TAB = realloc(TAB, sizeof(int)*4);


 
ca me (re)donne un tableau TAB qui vaut
 

Code :
  1. 1 2 3 4


 
 
avec un free() sur TAB[4] ????
 
 
je voudrais surtout savoir si en réallouant une taille plus petite ce qu'il y avait avant est libéré (et mis a NULL) ???
 
merci  [:arg]

Message cité 1 fois
Message édité par in_your_phion le 16-08-2006 à 18:07:13
Reply

Marsh Posté le 16-08-2006 à 18:06:24   

Reply

Marsh Posté le 16-08-2006 à 18:11:09    

man realloc
 

Citation :

    The realloc() function changes the size of the block pointed
     to by ptr to size bytes and returns a pointer to the (possi-
     bly moved) block.  The contents will be unchanged up to  the
     lesser  of the new and old sizes.
If  ptr is NULL, realloc()
     behaves like malloc() for the specified size. If  size is  0
     and  ptr  is  not a null pointer, the space pointed to is is
     made available for further allocation  by  the  application,
     though not returned to the system. Memory is returned to the
     system only upon termination of the application.


 
Bref, ça te garanti que rien ne change jusqu'aux min(taille originale, nouvelle taille) premiers bytes.
Pour moi, ça signifie qu'il y a bien modification de la taille allouée.

Message cité 1 fois
Message édité par Elmoricq le 16-08-2006 à 18:19:04
Reply

Marsh Posté le 16-08-2006 à 18:19:01    

Elmoricq a écrit :

man realloc
 

Citation :

    The realloc() function changes the size of the block pointed
     to by ptr to size bytes and returns a pointer to the (possi-
     bly moved) block.  The contents will be unchanged up to  the
     lesser  of the new and old sizes.
If  ptr is NULL, realloc()
     behaves like malloc() for the specified size. If  size is  0
     and  ptr  is  not a null pointer, the space pointed to is is
     made available for further allocation  by  the  application,
     though not returned to the system. Memory is returned to the
     system only upon termination of the application.



 
salut,
ca veut dire que le contenu sera inchangé jusqu'à la plus petite taille des deux blocs. Mais est ce que ca veut dire qu'au delà c'est libéré et mis à NULL ?
 
merci par avance

Reply

Marsh Posté le 16-08-2006 à 18:20:54    

in_your_phion a écrit :

Mais est ce que ca veut dire qu'au delà c'est libéré


 
C'est ce que je déduis de la manpage.  
 
 

in_your_phion a écrit :

et mis à NULL ?


 
Là, en revanche, je ne pense pas qu'il y ait une quelconque mise à NULL. La libération de la mémoire consiste juste à rendre à ton processus de la mémoire précédemment utilisée, et vu que la mémoire est libérée, il n'y a aucune raison qu'il se préoccupe de la réinitialiser.

Reply

Marsh Posté le 16-08-2006 à 18:21:51    

Elmoricq a écrit :

C'est ce que je déduis de la manpage.  
 
 
 
 
Là, en revanche, je ne pense pas qu'il y ait une quelconque mise à NULL. La libération de la mémoire consiste juste à rendre à ton processus de la mémoire précédemment utilisée, et vu que la mémoire est libérée, il n'y a aucune raison qu'il se préoccupe de la réinitialiser.


 
ok, merci beaucoup pour ta réponse
 
@+  :)

Reply

Marsh Posté le 18-08-2006 à 02:47:14    

Elmoricq a écrit :

...et vu que la mémoire est libérée, il n'y a aucune raison qu'il se préoccupe de la réinitialiser.


Il y a surtout une raison pour qu'il ne le fasse surtout pas, c'est d'éviter de perdre du temps à faire un truc totalement inutile...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 18-08-2006 à 19:10:51    

Elmoricq a écrit :

C'est ce que je déduis de la manpage.


 
Justement, ce n'est pas évident pour les petites tailles. Enfin, ça dépend complètement de comment est codé l'allocateur.

Reply

Marsh Posté le 18-08-2006 à 21:11:07    

C'est vrai qu'on ne peut fonctionner qu'à coup de déductions, et je me demande ce que dit la norme là-dessus.
Tout ce que la man page garantie, c'est que les bytes que nous voulons conserver restent inchangés, au-delà de ça...
 
Et c'est vrai que pour les faibles capacités, il n'y a aucun intérêt à faire autre chose qu'à retourner l'adresse d'origine sans rien modifier.
 
EDIT : bon apparemment, ce n'est pas que pour les petites capacités, en tout cas dans la glibc. C'est pas très lisible donc je peux me planter, mais ces lignes de codes laissent peu de place au doute :

   /* Note the extra SIZE_SZ overhead. */
    if(oldsize - SIZE_SZ >= nb) return oldmem; /* do nothing */


 
(nb est la taille souhaitée)
 
(SIZE_SZ == sizeof(size_t), je ne comprends pas bien pourquoi c'est pris en compte mais il y a surement une bonne raison... je pense néanmoins que dans le cadre de ce topic on peut l'ignorer, ça ne change pas grand chose)


Message édité par Elmoricq le 18-08-2006 à 21:35:03
Reply

Marsh Posté le 24-08-2006 à 13:29:37    

in_your_phion a écrit :

j'aimerais savoir si realloc est utile pour diminuer la taille d'un tableau alloué dynamiquement.


En principe oui. Pour les petits tableaux (ou les petites variations), j'ai des doutes sur l'utilité... En pratique, c'est rarement utile, sauf si la réduction est drastique... A ma connaissance, le langage C ne garanti pas que la zone 'libérée' soit réutilisable.. Rien n'est précisé quand à l'utilisation de la mémoire...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 24-08-2006 à 13:32:28    

in_your_phion a écrit :

Mais est ce que ca veut dire qu'au delà c'est libéré et mis à NULL ?


C'est libéré, mais ce n'est pas mis à NULL. Mais tu peux le faire à la main avant le realloc().


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 24-08-2006 à 13:32:28   

Reply

Marsh Posté le 25-08-2006 à 00:54:10    

Emmanuel Delahaye a écrit :

C'est libéré, mais ce n'est pas mis à NULL. Mais tu peux le faire à la main avant le realloc().


A manipuler avec précautions tout de même, car un l'intérêt du realloc ést de conserver les anciennes données ...

Reply

Marsh Posté le 25-08-2006 à 15:22:41    

Trap D a écrit :

A manipuler avec précautions tout de même, car un l'intérêt du realloc ést de conserver les anciennes données ...


Euh... je crois que tu n'as pas bien compris ce que voulait dire Emmanuel
Quand il disait qu'on peut mettre à NULL les données, il voulait parler des données qui, après realloc, seront au delà de la zone nouvellement allouée.
Si tu alloues moins que ce qu'il y a, c'est que tu ne veux pas conserver les données situées dans la zone libérée...

Reply

Marsh Posté le 25-08-2006 à 22:59:09    

Sve@r a écrit :

Euh... je crois que tu n'as pas bien compris ce que voulait dire Emmanuel
Quand il disait qu'on peut mettre à NULL les données, il voulait parler des données qui, après realloc, seront au delà de la zone nouvellement allouée.
Si tu alloues moins que ce qu'il y a, c'est que tu ne veux pas conserver les données situées dans la zone libérée...


D'où le "A manipuler avec précautions tout de même"  ;)

Reply

Marsh Posté le 28-08-2006 à 23:50:38    

Par contre on ne comprend tjrs pas ce que tu veux dire par réutiliser les anciennes données, en tout cas celles qui sont dans la zone libérée. Pour celles-ci, plus rien n'est garanti.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed