realloc
Réallouent les blocs de mémoire.
Syntaxe
void *realloc(
void *memblock,
size_t size
);
Paramètres
memblock
Pointeur désignant le bloc de mémoire précédemment alloué.
size
Nouvelle taille en octets.
Valeur retournée
realloc
retourne un pointeur void
vers le bloc de mémoire réalloué (et éventuellement déplacé).
S’il n’y a pas suffisamment de mémoire disponible pour étendre le bloc à la taille donnée, le bloc d’origine reste inchangé et NULL
est retourné.
Si size
a la valeur zéro, le bloc désigné par memblock
est libéré ; la valeur de retour est NULL
, et memblock
pointe vers un bloc libéré.
La valeur de retour pointe vers un espace de stockage adapté au stockage de n’importe quel type d’objet. Pour obtenir un pointeur vers un autre type que void
, utilisez un cast de type sur la valeur de retour.
Notes
Remarque
realloc
n’a pas été mis à jour pour implémenter le comportement C17, car le nouveau comportement n’est pas compatible avec le système d’exploitation Windows.
La fonction realloc
modifie la taille d’un bloc de mémoire alloué. L’argument memblock
pointe vers le début du bloc de mémoire. Si memblock
a la valeur NULL
, realloc
se comporte de la même façon que malloc
et alloue un nouveau bloc de size
octets. Si memblock
ce n’est pas NULL
le cas, il doit s’agir d’un pointeur retourné par un appel précédent à calloc
, malloc
ou realloc
.
L’argument size
indique la nouvelle taille du bloc, en octets. Le contenu du bloc est inchangé tant que la plus courte des tailles nouvelle et ancienne n’est pas atteinte, même si le nouveau bloc peut se trouver à un autre emplacement. Étant donné que le nouveau bloc peut se trouver dans un nouvel emplacement de mémoire, le pointeur retourné par realloc
n’est pas garanti comme pointeur passé par l’argument memblock
. realloc
n’a pas de mémoire nouvellement allouée s’il y a une croissance de mémoire tampon.
realloc
affecte à errno
la valeur ENOMEM
si l’allocation de mémoire échoue ou si la quantité de mémoire demandée dépasse _HEAP_MAXREQ
. Pour plus d’informations sur ce code et d’autres codes d’erreur, consultez , , _sys_errlist
_doserrno
et _sys_nerr
.errno
realloc
appelle malloc
pour utiliser la fonction C++ _set_new_mode
pour définir le nouveau mode de gestionnaire. Le nouveau mode de gestionnaire indique si, en cas d'échec, malloc
doit appeler la nouvelle routine de gestionnaire, telle qu'elle est définie par _set_new_handler
. Par défaut, malloc
n’appelle pas la nouvelle routine de gestionnaire en cas d’échec de l’allocation de mémoire. Vous pouvez remplacer ce comportement par défaut de sorte que, quand _realloc
ne parvient pas à allouer de la mémoire, malloc
appelle la routine de nouveau gestionnaire de la même façon que l’opérateur new
quand il échoue pour la même raison. Pour remplacer la valeur par défaut, appelez
_set_new_mode(1);
début dans un programme ou lien avec NEWMODE. OBJ (voir options de lien).
Lorsque l’application est liée à une version de débogage des bibliothèques runtime C, realloc
la résolution est _realloc_dbg
. Pour plus d’informations sur la gestion du tas pendant le processus de débogage, consultez le tas de débogage CRT.
realloc
est marqué __declspec(noalias)
et __declspec(restrict)
, ce qui signifie que la fonction est garantie de ne pas modifier les variables globales et que le pointeur retourné n’est pas alias. Pour plus d’informations, consultez noalias
et restrict
.
Par défaut, l’état global de cette fonction est limité à l’application. Pour modifier ce comportement, consultez État global dans le CRT.
Spécifications
Routine | En-tête requis |
---|---|
realloc |
<stdlib.h> et <malloc.h> |
Pour plus d’informations sur la compatibilité, consultez Compatibility.
Exemple
// crt_realloc.c
// This program allocates a block of memory for
// buffer and then uses _msize to display the size of that
// block. Next, it uses realloc to expand the amount of
// memory used by buffer and then calls _msize again to
// display the new amount of memory allocated to buffer.
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
int main( void )
{
long *buffer, *oldbuffer;
size_t size;
if( (buffer = (long *)malloc( 1000 * sizeof( long ) )) == NULL )
exit( 1 );
size = _msize( buffer );
printf_s( "Size of block after malloc of 1000 longs: %u\n", size );
// Reallocate and show new size:
oldbuffer = buffer; // save pointer in case realloc fails
if( (buffer = realloc( buffer, size + (1000 * sizeof( long )) ))
== NULL )
{
free( oldbuffer ); // free original block
exit( 1 );
}
size = _msize( buffer );
printf_s( "Size of block after realloc of 1000 more longs: %u\n",
size );
free( buffer );
exit( 0 );
}
Size of block after malloc of 1000 longs: 4000
Size of block after realloc of 1000 more longs: 8000