Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3169 connectés 

  FORUM HardWare.fr
  Programmation
  C

  realloc d'un tableau plus petit

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

realloc d'un tableau plus petit

n°1426230
in_your_ph​ion
Posté le 16-08-2006 à 18:06:24  profilanswer
 

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
mood
Publicité
Posté le 16-08-2006 à 18:06:24  profilanswer
 

n°1426232
Elmoricq
Modérateur
Posté le 16-08-2006 à 18:11:09  profilanswer
 

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
n°1426236
in_your_ph​ion
Posté le 16-08-2006 à 18:19:01  profilanswer
 

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

n°1426237
Elmoricq
Modérateur
Posté le 16-08-2006 à 18:20:54  profilanswer
 

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.

n°1426238
in_your_ph​ion
Posté le 16-08-2006 à 18:21:51  profilanswer
 

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
 
@+  :)

n°1426973
Sve@r
Posté le 18-08-2006 à 02:47:14  profilanswer
 

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.
n°1427456
docmaboul
Posté le 18-08-2006 à 19:10:51  profilanswer
 

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.

n°1427509
Elmoricq
Modérateur
Posté le 18-08-2006 à 21:11:07  profilanswer
 

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
n°1430624
Emmanuel D​elahaye
C is a sharp tool
Posté le 24-08-2006 à 13:29:37  profilanswer
 

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/
n°1430626
Emmanuel D​elahaye
C is a sharp tool
Posté le 24-08-2006 à 13:32:28  profilanswer
 

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/
mood
Publicité
Posté le 24-08-2006 à 13:32:28  profilanswer
 

n°1431120
Trap D
Posté le 25-08-2006 à 00:54:10  profilanswer
 

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 ...

n°1431468
Sve@r
Posté le 25-08-2006 à 15:22:41  profilanswer
 

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...

n°1431652
Trap D
Posté le 25-08-2006 à 22:59:09  profilanswer
 

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"  ;)

n°1432809
el muchach​o
Comfortably Numb
Posté le 28-08-2006 à 23:50:38  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  realloc d'un tableau plus petit

 

Sujets relatifs
résolu [API win32] probleme avec un petit exerciceEXCEL VBA - Bug pour affecter valeurs dans tableau
insérer un tableau dans un richtextboxpetit soucis requete sql sur deux table ( order spécial :) )
Petit soucis de syntaxe SQL... Je paye ma soeur pour une solution!petit soucis en batch
Div avec un Overflow hidden dans un tableau.Comment centrer un tableau au centre de la page?
Petit problème avec un script qui test la date d'installation de windoTableau et date
Plus de sujets relatifs à : realloc d'un tableau plus petit


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR