_expand
Modifie la taille d’un bloc de mémoire.
void *_expand(
void *memblock,
size_t size
);
memblock
Pointeur désignant le bloc de mémoire précédemment alloué.
size
Nouvelle taille en octets.
_expand
retourne un pointeur void désignant le bloc de mémoire réalloué. _expand
, contrairement realloc
à , ne peut pas déplacer un bloc pour modifier sa taille. Par conséquent, s’il existe suffisamment de mémoire disponible pour développer le bloc sans le déplacer, le memblock
paramètre doit être identique à _expand
la valeur de retour.
_expand
retourne NULL
quand une erreur est détectée au cours de son fonctionnement. Par exemple, si _expand
est utilisé pour réduire un bloc de mémoire, il peut détecter une altération dans le tas de petits blocs ou un pointeur de bloc non valide et retourner NULL
.
S’il n’y a pas suffisamment de mémoire disponible pour développer le bloc sans le déplacer, la fonction retourne NULL
. _expand
ne retourne jamais un bloc étendu à une taille inférieure à celle demandée. En cas d’échec, errno
en indique la nature. Pour plus d’informations sur errno
, voir errno
, _doserrno
, , _sys_errlist
et _sys_nerr
.
La valeur de retour pointe vers un espace de stockage adapté au stockage de n’importe quel type d’objet. Pour vérifier la nouvelle taille de l’élément, utilisez _msize
. Pour obtenir un pointeur vers un autre type que void
, utilisez un cast de type sur la valeur de retour.
La fonction _expand
modifie la taille d’un bloc de mémoire alloué en essayant d’étendre ou réduire le bloc sans déplacer son emplacement dans le tas. Le paramètre memblock
pointe vers le début du bloc. Le paramètre size
indique la nouvelle taille du bloc, en octets. Le contenu du bloc est inchangé jusqu’à la plus courte des tailles nouvelle et ancienne. memblock
ne devrait pas être un bloc qui a été libéré.
Notes
Sur les plateformes 64 bits, _expand
peut ne pas réduire le bloc si la nouvelle taille est inférieure à la taille actuelle ; en particulier, si le bloc était inférieur à 16 Ko et donc alloué dans la fonctionnalité Low Fragmentation Heap (Tas à faible fragmentation), _expand
laisse le bloc inchangé et retourne memblock
.
Lorsque l’application est liée à une version de débogage des bibliothèques runtime C, _expand
la résolution est _expand_dbg
. Pour plus d’informations sur la gestion du tas pendant le processus de débogage, consultez le tas de débogage CRT.
Cette fonction valide ses paramètres. S’il memblock
s’agit d’un pointeur Null, cette fonction appelle un gestionnaire de paramètres non valide, comme décrit dans la validation des paramètres. Si l’exécution est autorisée à se poursuivre, errno
a la valeur EINVAL
et la fonction retourne NULL
. Si size
elle est supérieure _HEAP_MAXREQ
à , errno
est définie sur ENOMEM
, et la fonction retourne NULL
.
Par défaut, l’état global de cette fonction est limité à l’application. Pour modifier ce comportement, consultez État global dans le CRT.
Fonction | En-tête requis |
---|---|
_expand |
<malloc.h> |
Pour plus d’informations sur la compatibilité, consultez Compatibility.
// crt_expand.c
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
int main( void )
{
char *bufchar;
printf( "Allocate a 512 element buffer\n" );
if( (bufchar = (char *)calloc( 512, sizeof( char ) )) == NULL )
exit( 1 );
printf( "Allocated %d bytes at %Fp\n",
_msize( bufchar ), (void *)bufchar );
if( (bufchar = (char *)_expand( bufchar, 1024 )) == NULL )
printf( "Can't expand" );
else
printf( "Expanded block to %d bytes at %Fp\n",
_msize( bufchar ), (void *)bufchar );
// Free memory
free( bufchar );
exit( 0 );
}
Allocate a 512 element buffer
Allocated 512 bytes at 002C12BC
Expanded block to 1024 bytes at 002C12BC