Partager via


_expand

Modifie la taille d’un bloc de mémoire.

Syntaxe

void *_expand(
   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

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

Notes

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

Remarque

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.

Spécifications

Fonction En-tête requis
_expand <malloc.h>

Pour plus d’informations sur la compatibilité, consultez Compatibility.

Exemple

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

Voir aussi

Allocation de mémoire
calloc
free
malloc
_msize
realloc