Malloc et des Pointeurs Void
Je suis étudiant cette fonction de malloc et je pourrais utiliser un peu d'aide:
static void *malloc(int size)
{
void *p;
if (size < 0)
error("Malloc error");
if (!malloc_ptr)
malloc_ptr = free_mem_ptr;
malloc_ptr = (malloc_ptr + 3) & ~3; /* Align */
p = (void *)malloc_ptr;
malloc_ptr += size;
if (free_mem_end_ptr && malloc_ptr >= free_mem_end_ptr)
error("Out of memory");
malloc_count++;
return p;
}
Je sais que le malloc func alloue de l'espace mémoire pour n'importe quel type, si il y a assez de mémoire, mais les lignes que je ne comprends pas:
p = (void *)malloc_ptr;
malloc_ptr += size;
Comment peut-il point à tout type de données de ce genre? Je ne peux pas comprendre que le vide de pointeur ou de son emplacement.
REMARQUE: malloc_ptr est un unsigned long
Ce code contient l'hypothèse qu'un pointeur vers
Le code suppose que personne n'a une plus strictes, de l'alignement de l'exigence que les 4 octets de l'alignement. Le code ne montre pas comment
unsigned long
(c'est à dire malloc_ptr
) peut aussi le point de tout autre objet, à partir d'un alignement de point de vue. Cette hypothèse n'est pas toujours vrai (par exemple, sur certains systèmes, il peut ne pas être en mesure de point à long double
objets).Le code suppose que personne n'a une plus strictes, de l'alignement de l'exigence que les 4 octets de l'alignement. Le code ne montre pas comment
free_mem_ptr
et free_mem_end_ptr
sont initialisés. Il ne renvoie pas NULL quand il n'y a pas plus d'espace. Si la fonction error()
retourne, puis l'enfer se déchaîne.OriginalL'auteur morcillo | 2012-12-25
Vous devez vous connecter pour publier un commentaire.
La raison pour laquelle elle renvoie un pointeur void est parce qu'il n'a aucune idée de ce que vous allouer de l'espace dans le
malloc
appel. Tous il sait la quantité d'espace que vous avez demandé. C'est à vous ou à votre compilateur de décider de ce qui remplit la mémoire. Le vide emplacement du pointeur est généralement mis en œuvre comme une liste chaînée pour maintenir l'intégrité et de savoir quelles sont les valeurs de la mémoire sont gratuits ce qui est étonnamment gardé la trace de lafree
fonction.Dans ce cas, vous devrez probablement utiliser le
sizeof
opérateur qui va déterminer la bonne taille en octets nécessaires pour bien répartir cette structure que vous avez déclaré.Je sais que le sizeof est pour cela, mais ce que je ne comprends pas, c'est comment fait-il pour allouer de l'espace dans la mémoire. malloc_ptr a la taille du type, mais comment p = (void *)malloc_ptr savoir pour allouer de 8 octets, soit 2 octets, soit 152 octets? le casting de la fonction de malloc qui le fait fonctionner? (my_struct *)malloc(sizeof(my_struct))??
Dans ce cas, la fonction assigne simplement le pointeur à ce que je suis en supposant est une struct comme une adresse mémoire. Il s'étend ensuite à la taille par l'int vous passé en paramètre, et donc "s'étend" l'allocation de mémoire par
size
octets de retourner le premier pointeur vers cette quantité de mémoire.Je vous remercie beaucoup. Aujourd'hui, le concept est plus clair dans ma tête. Je vais continuer à étudier. Déjà vous a donné un chèque de bonne réponse ... j'espère que c'est un assez bon cadeau de noël.
OriginalL'auteur squiguy
C'est le mise en œuvre de
malloc
, de sorte qu'il est autorisé à faire des choses qui ne serait pas légitime dans un programme régulier. Plus précisément, il est fait usage de la mise en œuvre définies par la conversion deunsigned long
àvoid *
. L'initialisation du programme définitmalloc_ptr
à la adresse numérique d'un grand bloc de mémoire non allouée. Ensuite, lorsque vous demandez une allocation,malloc
rend un pointeur en dehors de la valeur actuelle demalloc_ptr
et augmentemalloc_ptr
par le nombre d'octets que vous avez demandé. De cette façon, la prochaine fois que vous appelezmalloc
il sera de retour un nouveau pointeur.C'est le plus simple possible la mise en œuvre de
malloc
. Plus particulièrement, il semble ne jamais réutiliser la mémoire libérée.OriginalL'auteur zwol
Malloc retourne un pointeur pour un morceau de complètement déstructurée, plat mémoire. Le (void * pointeur signifie qu'il n'a aucune idée de ce qu'il désigne (pas de structure), simplement qu'il pointe vers la mémoire de taille de taille.
À l'extérieur de votre appel à malloc, vous pouvez dire à votre programme de ce pointeur a une certaine structure. I. e., si vous avez une structure
some_struct
vous pouvez dire:struct some_struct *pStruct = (struct some_struct *) malloc(sizeof(struct some_struct))
.Voir comment malloc ne connaît que la taille de ce qu'il va allouer, mais ne savent pas en réalité une structure? Votre appel à malloc est en passant d'aucune information sur la structure, simplement la taille de la quantité de mémoire à allouer.
C'est le C de la manière d'être générique: malloc renvoie un certain montant de mémoire et c'est votre travail de le jeter aux de la structuration de la mémoire dont vous avez besoin.
OriginalL'auteur DWright
Wiki explication sur le type coulée,
OriginalL'auteur Sunil Bojanapally
Comme vous le voyez, ces deux lignes,
ici, vous rencontrez des malloc_ptr de type unsigned long donc nous sommes de conversion de type de cette variable de type void et puis le stocker dans p.
et de manière similaire deuxième est la dénotation de l'malloc_ptr = malloc_ptr + taille;
Et ce les deux codes sont pour développeur comfortness que p est de type void pointeur donc, en application lorsque vous utilisez la fonction malloc vous ne savez pas quel type de bloc de mémoire sont à renvoyer par la fonction de sorte que cette fonction est toujours revient cette générique void pointeur de sorte que nous sommes en mesure de transtypage de nouveau dans notre application, selon l'exigence.
et même dans le deuxième code, si vous entrez la taille en négatif, ce qui se passe avec cette condition
OriginalL'auteur ravi bhuva