Fonction realloc

Entête à  inclure

#include <stdlib.h>  // <cstdlib> en C++

Fonction realloc

void * realloc( void * pointer, size_t memorySize );

Cette fonction permet de réallouer un bloc de mémoire dans le tas (le heap en anglais). Cela veut dire que si l'espace mémoire libre qui suit le bloc à réallouer est suffisament grand, le bloc de mémoire est simplement agrandi. Par contre si l'espace libre n'est pas suffisant, un nouveau bloc de mémoire sera alloué, le contenu de la zone d'origine recopié dans la nouvelle zone et le bloc mémoire d'origine sera libéré automatiquement.

Paramètres

  • pointer : l'adresse mémoire du bloc de mémoire à reallouer.
  • memorySize : permet de spécifier la taille (en octets) du bloc de mémoire à allouer.

Valeur de retour

Si tout ce passe bien, la fonction vous renvoie un pointeur sur la zone de mémoire réallouée. Attention, ce pointeur est de type pointeur générique (void *) : si nécessaire, il est donc de votre responsabilité de "caster" votre pointeur vers un autre type (du moins si vous souhaitez ne pas avoir de warning affiché pas le compilateur, ce que je vous recommande vivement).

Dans le cas ou le bloc de mémoire ne pourrait vous être réalloué (plus de mémoire disponible, par exemple), le pointer NULL vous sera retourné. On derait normalement et systématiquement tester que l'on ait pas cette valeur. Néanmoins cela n'est pas toujours fait par les développeurs. Donc un petit conseil, utilisez au moins un assert.

Exemple de code

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    
    int * ptr1 = (int *) malloc( sizeof(int) );
    assert( ptr1 != NULL );
    int * ptr2 = (int *) malloc( sizeof(int) );
    assert( ptr2 != NULL );
    
    (*ptr1) = 10;

    printf("ptr1=%p - ptr2=%p\n", ptr1, ptr2);

    ptr1 = (int *) realloc( ptr1, 10 * sizeof(int) );
    assert( ptr1 != NULL );

    printf( "ptr1=%p - ptr2=%p\n", ptr1, ptr2 );
    printf( "(*ptr1) = %d\n", *ptr1);

    free( ptr1 );
    free( ptr2 );

    /* 
        Un petit exemple d'exécution :
            ptr1=004302D0 - ptr2=004302A0
            ptr1=00430260 - ptr2=004302A0
            (*ptr1) = 10
        Pour information, ptr2 a été alloué pour être
        certain que ptr1 ne pourra être réallouer sur place.
    */
    
    return 0;
}

Sujets connexes