fonctions realloc et malloc

Regardez le code:

#include #include void main() { int *p; p = malloc(6); p = realloc(p, 10); if (p == NULL) { printf("error"); exit(1); } } 

Prenons cet exemple pour le code, supposons que la mémoire totale soit de 10 octets et que 2 octets soient utilisés par la déclaration du pointeur de type int et 6 octets par fonction de malloc. Les 2 octets restants sont occupés par d’autres programmes. pour étendre la mémoire pointée par le pointeur, il recherchera 10 octets en mémoire et, s’il n’est pas disponible, alloue 10 octets de mémoire à partir de la zone de tas, copie le contenu de malloc et le colle dans la nouvelle zone de mémoire allouée, puis puis supprimez la mémoire stockée dans malloc non?

Realloc () renvoie-t-il un pointeur NULL car la mémoire n’est pas disponible? Aucun droit!? Il va à la zone de tas pour l’allocation de mémoire non? Cela ne retourne pas un pointeur NULL, non?

Correct – si realloc ne peut pas redimensionner le bloc de mémoire que vous transmettez, il en crée un nouveau, copie les données et libère l’ancien.

TOUTEFOIS:

  1. malloc implémentations malloc ne fonctionnent généralement pas sur une granularité d’octet. La plupart de ceux que j’ai vus contournent les 16 octets les plus proches, car cela facilite la comptabilité et que de nombreux utilisateurs ont besoin de cet alignement de toute façon. Dans votre cas, cela finirait par rendre le realloc un no-op, puisque les deux tailles arrondissent à 16 octets.

  2. Dans la plupart des systèmes d’exploitation multitâches courants, la seule mémoire accessible à votre application est la sienne: la mémoire des autres applications ne vous gênera jamais. La mémoire allouée par les bibliothèques ou d’autres threads peut cependant l’être.

Comme indiqué dans le cahier des charges de realloc :

Si la nouvelle taille de l’object mémoire nécessite un déplacement de l’object, l’espace pour l’instanciation précédente de l’object est libéré.