Я должен перекодировать функцию malloc (3) в C.
Я должен использовать системный вызов mmap () для выделения страниц.
Я уже сделал несколько версий, но, поскольку это не былоработая, я решил сделать небольшую и быструю версию в одной функции для отладки.
Вот как я собираю свою программу тестирования с помощью моего malloc:
gcc unit_test.c libft/libft.a -L. -lft_malloc
И вотВот как мой make-файл компилирует мой malloc.so:
gcc -g -shared -undefined dynamic_lookup -o libft_malloc.so srcs/malloc.c srcs/debug.c
Моя программа unit_test.c очень проста, я хочу распределить строку по размеру 10, установить весь ее символ в 'a', затем распечатайте его:
#include "libft/libft.h"
#include "incs/malloc.h"
int main(void)
{
ft_putstr_fd("TEST 01\n", 2);
char *str;
int i;
str = NULL;
str = (char *)malloc(sizeof(char) * 10);
if (!str)
{
ft_putstr_fd("MALLOC FAILED\n", 2);
return (-1);
}
ft_putstr_fd("MALLOC SUCCESS\n", 2);
i = 0;
while (i < 9)
{
str[i] = 'a';
i++;
}
str[i] = '\0';
ft_putchar_fd('\n', 2);
ft_putstr_fd(str, 2);
ft_putchar_fd('\n', 2);
return (0);
}
Нет проблем.Он должен работать (он работает с настоящим malloc).
Вот как выглядит моя структура блока:
typedef struct s_block
{
size_t size;
char *memory;
struct s_block *next;
struct s_block *prev;
} t_block;
размер - это размер запрашиваемой памяти, память - указательна первый адрес памяти, который я хочу вернуть (я преобразовал его в символ *), следующий и предыдущий, поскольку это связанный список.
Наконец, это моя функция malloc:
void *malloc(size_t size)
{
char *memory;
t_block *block;
int i;
size_t total_size;
memory = NULL;
i = 0;
total_size = size + sizeof(t_block);
while (total_size % 16) // Align memory
total_size++;
memory = mmap(0, total_size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
while (i < total_size)
{
memory[i] = 'z';
i++;
}
db_putstr_fd("Printing memory...\n", 2);
db_putstr_fd(memory, 2);
db_putchar_fd('\n', 2);
block = (t_block *)&memory;
block->size = size;
block->next = NULL;
block->prev = NULL;
db_putstr_fd("Block size = ", 2);
db_putnbr_fd(block->size, 2);
db_putchar_fd('\n', 2);
block->memory = (char *)&block + sizeof(t_block);
i = 0;
while (i < block->size)
{
db_putstr_fd("i = ", 2);
db_putnbr_fd(i, 2);
db_putstr_fd("\tsize = ", 2);
db_putnbr_fd(block->size, 2);
db_putchar_fd('\n', 2);
block->memory[i] = 'a';
i++;
}
db_putstr_fd("Out of loop\n", 2);
db_putstr_fd(block->memory, 2);
db_putchar_fd('\n', 2);
return (block->memory);
}
Итак, я отображаю память char * (будет заменен страницами, когда я буду уверен, что это будет работать).Я установил свой блок в начале этой памяти, а затем я инициализирую все переменные структур блока.
Моя проблема может заключаться в том, что я задаю строковый адрес блока.
Я добровольно сделал отступ для своих строк отладки, так каких много, так что вы можете лучше увидеть интересные линии;но я решил оставить их, чтобы показать вам результат:
TEST 01
Printing memory...
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
Block size = 10
i = 0 size = 10
i = 1 size = 10
i = 2 size = 10
i = 3 size = 10
i = 4 size = 10
i = 5 size = 10
i = 6 size = 10
i = 7 size = 10
i = 8 size = 10
i = 9 size = 10
Out of loop
aaaaaaaaaa
[1] 59894 segmentation fault ./a.out
Как вы можете видеть, я могу записать в память в моем malloc, но затем, когда я возвращаю его, программа segfault.Я думаю, что это происходит в строке 11 моего файла unit_test.c, но почему?
Как я могу записать в строку памяти функцию malloc, но затем не могу вернуть ее в программу, которая называется malloc?
Я что-то пропустил?