realloc d'un tableau plus petit - C - Programmation
Marsh Posté le 16-08-2006 à 18:11:09
man realloc
Citation : The realloc() function changes the size of the block pointed |
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.
Marsh Posté le 16-08-2006 à 18:19:01
Elmoricq a écrit : man realloc
|
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
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.
Marsh Posté le 16-08-2006 à 18:21:51
Elmoricq a écrit : C'est ce que je déduis de la manpage. |
ok, merci beaucoup pour ta réponse
@+
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...
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.
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. */ |
(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)
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...
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().
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 ...
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...
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 |
D'où le "A manipuler avec précautions tout de même"
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.
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
est ce que si je fais
ca me (re)donne un tableau TAB qui vaut
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
Message édité par in_your_phion le 16-08-2006 à 18:07:13