Namespaces
Variants

realloc

From cppreference.net
Défini dans l'en-tête <stdlib.h>
void * realloc ( void * ptr, size_t new_size ) ;

Réalloue la zone de mémoire donnée. Si ptr n'est pas NULL, il doit avoir été préalablement alloué par malloc , calloc ou realloc et ne pas encore avoir été libéré par un appel à free ou realloc . Sinon, le comportement est indéfini.

La réallocation se fait soit par :

a) l'expansion ou la contraction de la zone existante pointée par ptr , si possible. Le contenu de la zone reste inchangé jusqu'à la plus petite des nouvelles et anciennes tailles. Si la zone est étendue, le contenu de la nouvelle partie du tableau est indéfini.
b) allouer un nouveau bloc mémoire de taille new_size octets, copier la zone mémoire avec une taille égale à la plus petite des nouvelles et anciennes tailles, et libérer l'ancien bloc.

S'il n'y a pas assez de mémoire, le bloc de mémoire ancien n'est pas libéré et un pointeur nul est retourné.

Si ptr est NULL , le comportement est le même que celui de l'appel à malloc ( new_size ) .

Sinon,

si new_size est zéro, le comportement est défini par l'implémentation (un pointeur nul peut être retourné (auquel cas l'ancien bloc mémoire peut être libéré ou non), ou un pointeur non nul peut être retourné mais ne peut pas être utilisé pour accéder au stockage). Cet usage est déprécié (via C DR 400 ). (depuis C17)

(jusqu'à C23)

si new_size est zéro, le comportement est indéfini.

(depuis C23)

realloc est sûr pour les threads : il se comporte comme s'il n'accédait qu'aux emplacements mémoire visibles via son argument, et non à un stockage statique.

Un appel précédent à free ou realloc qui désalloue une région de mémoire se synchronise avec un appel à toute fonction d'allocation, y compris realloc qui alloue la même région ou une partie de la même région de mémoire. Cette synchronisation se produit après tout accès à la mémoire par la fonction de désallocation et avant tout accès à la mémoire par realloc . Il existe un ordre total unique pour toutes les fonctions d'allocation et de désallocation opérant sur chaque région de mémoire particulière.

(depuis C11)

Table des matières

Paramètres

ptr - pointeur vers la zone mémoire à réallouer
new_size - nouvelle taille du tableau en octets

Valeur de retour

En cas de succès, retourne le pointeur vers le début de la mémoire nouvellement allouée. Pour éviter une fuite mémoire, le pointeur retourné doit être désalloué avec free ou realloc . Le pointeur original ptr est invalidé et tout accès à celui-ci est un comportement indéfini (même si la réallocation a été effectuée en place).

En cas d'échec, retourne un pointeur nul. Le pointeur original ptr reste valide et pourrait nécessiter une désallocation avec free ou realloc .

Notes

À l'origine (en C89), la prise en charge de la taille zéro a été ajoutée pour accommoder du code tel que

OBJ *p = calloc(0, sizeof(OBJ)); // espace réservé de "longueur nulle"
/*...*/
while (1)
{
    p = realloc(p, c * sizeof(OBJ)); // réallocations jusqu'à stabilisation de la taille
    /* code susceptible de modifier c ou de sortir de la boucle */
}

Exemple

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void print_storage_info(const int* next, const int* prev, int ints)
{
    if (next)
        printf("%s location: %p. Size: %d ints (%ld bytes).\n",
               (next != prev ? "New" : "Old"), (void*)next, ints, ints * sizeof(int));
    else
        printf("Allocation failed.\n");
}
int main(void)
{
    const int pattern[] = {1, 2, 3, 4, 5, 6, 7, 8};
    const int pattern_size = sizeof pattern / sizeof(int);
    int *next = NULL, *prev = NULL;
    if ((next = (int*)malloc(pattern_size * sizeof *next))) // allocates an array
    {
        memcpy(next, pattern, sizeof pattern); // fills the array
        print_storage_info(next, prev, pattern_size);
    }
    else
        return EXIT_FAILURE;
    // Reallocate in cycle using the following values as a new storage size.
    const int realloc_size[] = {10, 12, 512, 32768, 65536, 32768};
    for (int i = 0; i != sizeof realloc_size / sizeof(int); ++i)
    {
        if ((next = (int*)realloc(prev = next, realloc_size[i] * sizeof(int))))
        {
            print_storage_info(next, prev, realloc_size[i]);
            assert(!memcmp(next, pattern, sizeof pattern));  // is pattern held
        }
        else // if realloc failed, the original pointer needs to be freed
        {
            free(prev);
            return EXIT_FAILURE;
        }
    }
    free(next); // finally, frees the storage
    return EXIT_SUCCESS;
}

Sortie possible :

New location: 0x144c010. Size: 8 ints (32 bytes).
Old location: 0x144c010. Size: 10 ints (40 bytes).
New location: 0x144c450. Size: 12 ints (48 bytes).
Old location: 0x144c450. Size: 512 ints (2048 bytes).
Old location: 0x144c450. Size: 32768 ints (131072 bytes).
New location: 0x7f490c5bd010. Size: 65536 ints (262144 bytes).
Old location: 0x7f490c5bd010. Size: 32768 ints (131072 bytes).

Références

  • Norme C23 (ISO/IEC 9899:2024) :
  • 7.22.3.5 La fonction realloc (p: TBD)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.22.3.5 La fonction realloc (p : 254)
  • Norme C11 (ISO/CEI 9899:2011) :
  • 7.22.3.5 La fonction realloc (p: 349)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.20.3.4 La fonction realloc (p : 314)
  • Norme C89/C90 (ISO/IEC 9899:1990) :
  • 4.10.3.4 La fonction realloc

Voir aussi

Documentation C++ pour realloc