# C et C++ > C > Contribuez >  [FAQ] Realloc comment a marche?

## theludovyc

Bonjours,

J'ai fait quelques recherche sur la fonction realloc pour savoir comment l'utiliser dans mon programme en passant notamment par :
https://fr.wikibooks.org/wiki/Progra...a_m%C3%A9moire
http://rperrot.developpez.com/articles/c/allocationC/
https://www.gladir.com/CODER/C/realloc.htm

Ils donnent plusieurs dfinitions ou explications similaire :
realloc tentera de rajuster la taille du bloc point par ancien_bloc  la nouvelle taille spcifie
a fonction realloc() tente de redimensionner un bloc mmoire
Cette fonction permet de changer la taille d'un bloc de mmoire dynamique
"Nous passons donc comme premier argment tableau, qui est le pointeur que l'on va redimenssioner"

De cette ambigut l'ont peut penser de la faon suivante :
Realloc tente de redimensionner le bloc pointer par le premier argument en regardant s'il y a de la place en mmoire  sa suite, si oui il est agrandi, sinon cela ne marche pas.

J'espre que cela pourra en aider plus d'un  y voir plus clair  ::):  !

Je propose donc de rajouter dans la FAQ C en 4.5 :
Realloc comment a marche?
Lors d'une pratique de l'allocation mmoire, parfois l'envie d'augmenter ou de diminu la taille d'une allocation se fait sentir. La fonction realloc est utile principalement dans ces deux cas.

prototype de la fonction realloc :
void *realloc(void *blocACopier, size_t nouvelleTaille);

Le plus couramment : pour une augmentation, la fonction realloc va chercher en mmoire la taille demand en second argument et y recopier le contenu pointer par le premier argument puis le libre automatiquement. Si elle choue  n'en pas trouv, NULL est retourn et elle ne libre pas le contenu pointer par le premier argument. Il est  savoir que la fonction realloc ne peut chouer que dans le cas d'une augmentation.
La fonction realloc peut alors s'interprter (le code suivant n'est pas compilable) de la faon suivante :


```

```

Dans le cas d'une augmentation comme la fonction realloc peut chou, il est recommand de l'utilis de la faon suivante (le code suivant peut tre compil et excut):


```

```

Pour une diminution, la fonction realloc peut agir sois comme prcdemment, sans chec possible, et allouer une nouvelle zone mmoire, recopier, et retourner un pointeur diffrent. Sois simplement diminuer la taille du bloc allou et retourner un pointeur gal au premier argument.

Pour finir, la fonction realloc peut tre utilise de la mme faon que la fonction malloc en mettant le premier argument a NULL.

----------


## dalfab

Bonjour,

Il y a aussi le cas o la taille demande est plus petite que la taille courante  prendre en compte.

realloc() peut ou pas conserver la valeur initiale du pointeur. S'il retourne un autre pointeur c'est qu'il a copi les donnes prcdentes dans le nouveau buffer et libr le buffer prcdent. realloc() ne peut chouer que dans le cas o on souhaite agrandir la taille du buffer, il retourne alors NULL (et ne libre pas le buffer prcdent).

----------


## theludovyc

> Bonjour,
> 
> Il y a aussi le cas ...


Premier post mis  jour dit moi ce que tu en pense  :;):  !

----------


## Mat.M

> De cette ambigut l'ont peut penser de la faon suivante :


dans un langage informatique l'ambigut a n'existe pas sinon a ne compile pas...
quand on dfinit quelque chose dans un code source c'est clair et net.

Ensuite Realloc ne tente rien du tout , realloc fait ce que l'on lui dit de faire....
realloc n'choue que s'il ne peut pas rallouer un bloc mmoire dans le tas ( en anglais c'est_ heap memory_ ) c.a.d. s'il n'y a pas assez de mmoire vive.
La mmoire dans le tas c'est l'OS qui l'alloue par rapport  la mmoire statique bref les cases mmoires o sont ranges les variables du programme excutable.

Donc j'ai l'impression que l'utilisation de malloc et realloc n'est pas du tout comprise.
Dans un langage "manag" comme Java ou C# c'est pareil.

comme je l'ai cris dans un autre fil de discussion , ancienneTaille doit tre infrieure  nouvelleTaille sinon il y a risque de fuite mmoire notamment sur l'appel de memcpy
Sinon c'est vouloir craser un tampon mmoire trop petit par rapport  ce que l'on veut copier..
Ensuite on ne sait pas d'o vient ancienneTaille  :8O: 



> Realloc tente de redimensionner le bloc pointer par le premier argument en regardant s'il y a de la place en mmoire  sa suite, si oui il est agrandi, sinon cela ne marche pas.


realloc ne regarde pas forcment s'il y a de la mmoire  sa suite ;  
realloc regarde s'il y a des zones mmoires disponibles ; en gnral les systmes d'exploitation le font de manire pagine ( consulter pour cela le livre de Jeffrey Richter concernant Windows)

Ensuite je pense que l'utilisation de malloc et realloc n'est pas du tout comprise

 ::fleche::  Si je veux allouer un tableau dynamique , j'appelle malloc qui va m'allouer le nombre d'lments par la taille de type de cet lment  ( par exemple un int en gnral c'est 4 octets)
et malloc va retourner une adresse mmoire.

En Assembleur c'est une adresse o les registres ( avec intel par exemple EAX,ECX...) vont ventuellement chercher les donnes.
Donc mettons que l'on ait une adresse sur 32 bits,  cette adresse sera le descripteur/pointeur d'un bloc contig.
Pour adresser ce bloc le descripteur va se dcaler de sizeof( type de donne ).

 ::fleche::  Pour ce qui est de realloc  mon sens le programme va effacer le pointeur allou par malloc et en rattribuer un nouveau en faisant effectivement une sorte de memcpy.

Sauf que lors de la compilation en code machine donc en code assembleur ( puisque la compilation du langage C donne du code assembleur ), le compilateur lui il le sait que tel tableau allou dynamiquement en mmoire est gr par tel pointeur/descripteur ; la gestion se fait par dcalage pointeur.
Pour ce qui de la valeur du pointeur c'est l'OS qui attribue cette valeur en fonction des disponibilits mmoires

----------


## theludovyc

> dans un langage informatique l'ambigut a n'existe pas sinon a ne compile pas...
> quand on dfinit quelque chose dans un code source c'est clair et net.


Bonjour @Mat.M,
L'ambigut ne dsigne pas le code source, j'ai employ ce terme pour dsign les dfinitions que j'ai trouv.




> Ensuite Realloc ne tente rien du tout , realloc fait ce que l'on lui dit de faire....
> realloc n'choue que s'il ne peut pas rallouer un bloc mmoire dans le tas ( en anglais c'est_ heap memory_ ) c.a.d. s'il n'y a pas assez de mmoire vive.


Je vois ce que tu veux dire. Tu aurais surement prfr quelque chose du genre : realloc est une fonction pour rallou un bloc mmoire, elle peut chou s'il n'y a pas assez de place en mmoire vive. Cependant avec tenter on sait qu'il peut y avoir une erreur, un echec. Ainsi : realloc est une fonction qui tente de rallou un bloc mmoire, elle choue s'il n'y a pas assez de place en mmoire vive. Je trouve la seconde version beaucoup plus parlante.




> Donc j'ai l'impression que l'utilisation de malloc et realloc n'est pas du tout comprise.
> Dans un langage "manag" comme Java ou C# c'est pareil.


C'est a dire?




> comme je l'ai cris dans un autre fil de discussion , ancienneTaille doit tre infrieure  nouvelleTaille sinon il y a risque de fuite mmoire notamment sur l'appel de memcpy
> Sinon c'est vouloir craser un tampon mmoire trop petit par rapport  ce que l'on veut copier..
> Ensuite on ne sait pas d'o vient ancienneTaille


Oui c'est pour cela que je ne fait cette interprtation qu'en cas d'une augmentation. Je vais faire une mise a jour pour parl de ancienneTaille, c'est vrai qu'elle est l un peu par magie pour le coup ^^.




> realloc ne regarde pas forcment s'il y a de la mmoire  sa suite ;  
> realloc regarde s'il y a des zones mmoires disponibles ; en gnral les systmes d'exploitation le font de manire pagine ( consulter pour cela le livre de Jeffrey Richter concernant Windows)


Donc si l'on obtient le mme pointeur c'est part chance? Merci pour le livre c'est ce que je cherchais. Par contre t'a pas moins cher?  ::mrgreen:: 




> En Assembleur c'est une adresse o les registres ( avec intel par exemple EAX,ECX...) vont ventuellement chercher les donnes.
> Donc mettons que l'on ait une adresse sur 32 bits,  cette adresse sera le descripteur/pointeur d'un bloc contig.
> Pour adresser ce bloc le descripteur va se dcaler de sizeof( type de donne ).


Tu peut m'en dire plus? C'est  dire dcaler de sizeof? Je n'arrive pas  comprendre.




> Sauf que lors de la compilation en code machine donc en code assembleur ( puisque la compilation du langage C donne du code assembleur ), le compilateur lui il le sait que tel tableau allou dynamiquement en mmoire est gr par tel pointeur/descripteur ; la gestion se fait par dcalage pointeur.


Donc il n'y a pas de sorte de memcopy?




> Pour ce qui de la valeur du pointeur c'est l'OS qui attribue cette valeur en fonction des disponibilits mmoires


Est ce qu'il y a d'autre fonctions que malloc, calloc, free, realloc... Pour jouer avec de faon plus prcise, plus directe?

Merci pour tes rponses  ::):

----------


## LittleWhite

Bonjour,

J'ai bien aim votre interrogation et vous avez raison qu'il faille une entre dans la FAQ.
Voici ma proposition. Dites moi ce que vous en pensez.

Je repose sur la documentation de realloc prsent sous Linux (manpages). Voici ce qui est stipul :



> The realloc() function returns a pointer to the newly allocated memory,
>        which is suitably aligned for any built-in type and  may  be  different
>        from ptr, or NULL if the request fails.  If size was equal to 0, either
>        NULL or a pointer suitable to be passed  to  free()  is  returned.   If
>        realloc()  fails, the original block is left untouched; it is not freed
>        or moved.


Et :



> The realloc() function returns a pointer to the newly allocated memory,
>        which is suitably aligned for any built-in type and  may  be  different
>        from ptr, or NULL if the request fails.  If size was equal to 0, either
>        NULL or a pointer suitable to be passed  to  free()  is  returned.   If
>        realloc()  fails, the original block is left untouched; it is not freed
>        or moved.

----------


## LittleWhite

Hop, j'ai fais une nouvelle version, suite aux remarques de Winjerome.

----------


## LittleWhite

Encore une version et je passe en relecture orthographique en vue d'une intgration dans la FAQ.

----------


## LittleWhite

Encore une version, sur les bons conseils de WInjerome.

----------


## LittleWhite

Intgr :
https://c.developpez.com/faq/?page=L...ite-de-reallochttps://c.developpez.com/faq/?page=L...iliser-realloc

----------

