Relation Malloc et Realloc, comment se comporte-t-il lorsque l’espace requirejs n’est pas disponible en mémoire?

Dupliquer possible:
fonctions realloc et malloc

#include #include void main() { int *p; p = malloc(6); p = realloc(p, 10); if (p == NULL) { printf("error"); // when does p point to null consider i have enough space in prgrm //memory area but not in memory where realloc is trying to search //for the memory, I dont know how to explain that try to undrstnd 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?

Ecoute moi: | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 |

considérez ceci comme des blocs de mémoire: supposons que malloc () fonctionne de 01 à 06, 07 et 08 soient libres et que les 2 derniers blocs i, e 09 et 10 sont utilisés par la mémoire d’autres programmes. Maintenant, lorsque j’appelle realloc (p, 10), j’ai besoin de 10 octets, mais il n’ya que 2 octets gratuits. Que fait realloc? renvoyer un pointeur NULL ou allouer de la mémoire à partir de la zone de tas et copier le contenu des blocs de mémoire de 01 à 06 dans cette mémoire de la zone de tas, veuillez me le faire savoir.

Valeur de retour

La fonction realloc () renvoie un pointeur sur la mémoire nouvellement allouée, qui est correctement alignée pour tout type de variable et peut être différente de ptr ou NULL si la requête échoue. Si size était égal à 0, NULL ou un pointeur approprié pour être transmis à free () est renvoyé. Si realloc () échoue, le bloc d’origine rest inchangé. il n’est pas libéré ou déplacé.

malloc

  1. Ceci allouera le bloc de mémoire s’il est disponible, sinon il retournera NULL.

realloc

  1. Si la taille transmise est supérieure à celle du bloc existant, cette opération essaiera d’étendre la mémoire existante. Si l’opération réussit, le même pointeur sera renvoyé.
  2. Ou bien si son échec à exapand alors il allouera le nouveau bloc de mémoire et il copiera les anciennes données de l’ancien bloc de mémoire dans un nouveau bloc de mémoire. Ensuite, l’ancien bloc sera libéré et l’adresse des nouveaux blocs sera renvoyée.
  3. Si l’allocation d’un nouveau bloc de mémoire a échoué, il retournera simplement NULL, sans libérer l’ancien bloc de mémoire.
  4. Si la taille transmise est zéro pour la fonction realloc , alors l’ancien bloc de mémoire sera libéré et la valeur NULL sera renvoyée. realloc(ptr, 0) est équivalent à free(ptr) .
  5. Si la taille transmise à la fonction realloc est inférieure à la taille de l’ancien bloc de mémoire, la mémoire sera réduite.

Répondre à votre scénario

 Ecoute moi: |  01 |  02 |  03 |  04 |  05 |  06 |  07 | 08 | 09 |  10 |

 considérez ceci comme des blocs de mémoire: supposons que 01 à 06 ait été utilisé par malloc () 
 func, 07 et 08 sont gratuits et les 2 derniers blocs i, e 09 et 10 sont utilisés par 
 mémoire d'autres programmes.  Maintenant, quand j’appelle realloc (p, 10), j’ai besoin de 10 octets mais 
 il n'y a que 2 octets gratuits, alors que fait realloc?  retourne un pointeur NULL 
 ou allouer de la mémoire à partir de la zone de tas et copier le contenu de 01 à 06 
 blocs de mémoire à cette mémoire dans la zone de tas, s'il vous plaît faites le moi savoir.

Oui, il copiera le contenu de 01 à 06 de l’ancien bloc de mémoire dans un nouveau bloc de mémoire et libérera l’ancien bloc de mémoire, puis renverra l’adresse du nouveau bloc de mémoire.

La manière dont malloc est implémenté dépend, par définition, du système ou de la mise en œuvre. (Une implémentation idiote, mais conforme aux normes, de malloc échouerait toujours en renvoyant NULL ; la plupart des implémentations réelles sont meilleures que cela).

Lisez tout d’abord les spécifications comportementales de malloc , realloc , free (standard Posix).