2012-08-25 3 views
-5

Regardez le code:fonctions realloc et malloc

#include<stdio.h> 


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

Prenez cet exemple pour le code, supposons que la mémoire totale est de 10 octets et 2 octets est utilisé par la déclaration de pointeur de type int et ohter 6 octets par la fonction malloc les 2 octets restants sont occupés par d'autres programmes, maintenant quand j'exécute la fonction realloc pour étendre la mémoire vers laquelle pointe le pointeur, elle va rechercher 10 octets en mémoire et quand elle n'est pas disponible elle alloue 10 octets de mémoire taser la zone et copier le contenu de malloc et le coller dans la nouvelle zone de mémoire allouée dans la zone de tas, puis supprimer la mémoire stockée dans malloc droite?

Est-ce que realloc() renvoie un pointeur NULL parce que la mémoire n'est pas disponible? Aucun droit!? Il va à la zone de tas pour l'allocation de la mémoire à droite? Il ne renvoie pas un pointeur NULL à droite?

+0

'quand il est pas disponible, il alloue 10 octets de mémoire de heap' Est-ce que ce doit être « est » plutôt que « n'est pas »? –

Répondre

1

Comme indiqué au specification for realloc:

Si la nouvelle taille de l'objet de mémoire nécessite un mouvement de l'objet, l'espace pour l'instanciation de l'objet précédent est libéré.

3

Correct - si realloc ne peut pas redimensionner le bloc de mémoire que vous passez, il fait une nouvelle, copie les données et Libère l'ancien.

CEPENDANT:

  1. malloc mises en œuvre ne fonctionnent généralement pas sur une granularité d'octets. La plupart de ceux que j'ai vus arrondissent tout aux 16 octets les plus proches, car cela rend la comptabilité plus facile, et de nombreux utilisateurs auront besoin de cet alignement de toute façon. Dans votre cas, cela finirait par rendre le realloc non-op, puisque les deux tailles arrondissent à 16 octets. Dans la plupart des systèmes d'exploitation multitâches courants, la seule mémoire accessible à votre application est la sienne - la mémoire d'autres applications ne vous gênera jamais. La mémoire allouée par les bibliothèques ou d'autres threads pourrait, cependant.

+0

Ouais ok, jetez un oeil à ce Si realloc ne peut pas allouer 10 octets cos le reste des 2 octets est occupé par d'autres programmes va-t-il retourner un pointeur NULL? – john

+0

Les deux autres octets * ne peuvent pas * être occupés par "autres programmes"; ils ont leur propre tas de travail. – duskwuff

+0

@john Ce que vous pensez s'appelle la fragmentation. Il est possible que 'realloc' ne réussisse pas à développer un segment existant. Dans ce cas, il extrait un nouveau segment du tas, copie l'ancien contenu et renvoie le nouveau pointeur. Mais vous supposez que les appels consécutifs à 'malloc' retourneront la mémoire contiguë. Ce n'est généralement pas le cas, comme le fait remarquer le crépuscule. Par exemple, la mémoire malloced aura un certain alignement. Il est également courant d'avoir plusieurs pools (ou arènes) pour des blocs de tailles différentes et d'utiliser 'mmap' pour les requêtes de très grande taille. –