C Language Réaffecter la mémoire


Exemple

Vous devrez peut-être agrandir ou réduire l'espace de stockage du pointeur après lui avoir affecté de la mémoire. La fonction void *realloc(void *ptr, size_t size) l'ancien objet pointé par ptr et renvoie un pointeur sur un objet ayant la taille spécifiée par size . ptr est le pointeur sur un bloc de mémoire précédemment alloué avec malloc , calloc ou realloc (ou un pointeur nul) à réallouer. Le contenu maximal possible de la mémoire d'origine est préservé. Si la nouvelle taille est plus grande, toute mémoire supplémentaire au-delà de l'ancienne taille n'est pas initialisée. Si la nouvelle taille est plus courte, le contenu de la partie réduite est perdu. Si ptr est NULL, un nouveau bloc est alloué et un pointeur sur celui-ci est renvoyé par la fonction.

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    int *p = malloc(10 * sizeof *p);
    if (NULL == p) 
    {
        perror("malloc() failed");
        return EXIT_FAILURE;
    }
 
    p[0] = 42;
    p[9] = 15;

    /* Reallocate array to a larger size, storing the result into a
     * temporary pointer in case realloc() fails. */
    {
        int *temporary = realloc(p, 1000000 * sizeof *temporary);

        /* realloc() failed, the original allocation was not free'd yet. */
        if (NULL == temporary)
        {
            perror("realloc() failed");
            free(p); /* Clean up. */
            return EXIT_FAILURE;
        }      

        p = temporary;
    }

    /* From here on, array can be used with the new size it was 
     * realloc'ed to, until it is free'd. */

    /* The values of p[0] to p[9] are preserved, so this will print:
       42 15
    */
    printf("%d %d\n", p[0], p[9]);

    free(p);

    return EXIT_SUCCESS;
}

L'objet réalloué peut ou non avoir la même adresse que *p . Par conséquent, il est important de capturer la valeur de retour de realloc qui contient la nouvelle adresse si l'appel est réussi.

Assurez-vous d'attribuer la valeur de retour de realloc à un p temporary au lieu de l'original. realloc renverra null en cas de défaillance, ce qui écraserait le pointeur. Cela perdrait vos données et créerait une fuite de mémoire.