Participer au site avec un Tip
Rechercher
 

Améliorations / Corrections

Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.

Emplacement :

Description des améliorations :

Fonction realloc

La macro RAND_MAX La fonction srand


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

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 devrait normalement et systématiquement tester que la fonction ne renvoit 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

<stdlib.h>
aligned_alloc
calloc
free
malloc


La macro RAND_MAX La fonction srand