2017-07-17 2 views
-2

J'ai ce code:C | Pointeur | Segmentation fault

Mon problème est que, chaque fois que j'appelle cette fonction ma_init(); je reçois une erreur de segmentation sur footer->status = FREE; J'apprécierais que quelqu'un me pointe dans la bonne direction parce qu'après quelques heures de recherches, je n'arrive pas à comprendre.

Edit: fichier d'en-tête:

+0

votre 'size size;' ne peut pas contenir la taille réelle, car le nombre est trop grand pour cela. – mch

+0

Quel est le type de 'mem_chunk_header :: size'? Cela ne devrait-il pas être 'size_t'? – dhke

+0

@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

Répondre

1

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.

+0

Vous avez vraiment besoin d'investir plus de temps, notamment apprendre à utiliser le débogueur. –