typedef octet unsigned char;
Ceci est illisible. Envisagez d'inclure <stdint.h>
et en utilisant uint8_t
.
Mon problème est que, chaque fois que j'appelle cette fonction ma_init(); Je reçois un défaut de segmentation sur footer-> status = FREE;
S'il vous plaît apprendre à compiler avec tous les avertissements & les informations de débogage (par exemple gcc -Wall -Wextra -g
avec GCC ...) puis utiliser le débogueur (gdb
) ...
Vous initialisez header
à l'adresse de mem_pool
.
Ensuite, vous faites quelques discutables (qui est mal) pointer arithmetic
mem_chunk_header * footer = header + header->size + sizeof(mem_chunk_header);
// the + above are likely to be wrong
Vous ajoutez à un pointeur header
de sorte que le +
est en termes de taille de l'élément pointu (non octets), c'est en unités de sizeof(mem_chunk_header)
ce qui est certainement au moins 2 et probablement plus (sur mon bureau Linux/x86-64 c'est 8
). Votre footer
est loin. Avec un débogueur, vous auriez remarqué que (en interrogeant les valeurs de header
, footer
, mem_pool
). Pensez à utiliser aussi valgrind
BTW, si vous codez un memory allocator à la malloc
vous meilleure base sur le système d'exploitation primitives spécifiques (généralement system calls) la modification de votre virtual address space. Sous Linux, vous utiliseriez mmap(2) et vos amis.
me
des points dans la bonne direction font ici après quelques googler pendant quelques heures
Vous devez passer semaines lisant un bon livre de programmation C. Les heures de travail ne suffisent pas dans votre cas.
votre 'size size;' ne peut pas contenir la taille réelle, car le nombre est trop grand pour cela. – mch
Quel est le type de 'mem_chunk_header :: size'? Cela ne devrait-il pas être 'size_t'? – dhke
@dhke Je viens de l'ajuster dans la question. J'ai oublié d'ajouter ceci dans la question. Pardon. 'size size' est de type' int'. – Bobby