gpt4 book ai didi

c - 使用 mmap 重新编码 malloc 奇怪的段错误

转载 作者:行者123 更新时间:2023-11-30 19:30:50 28 4
gpt4 key购买 nike

我实际上正在使用 mmap 函数重新编码 malloc,问题是我在分配的内存结束之前很大程度上遇到了段错误。我找不到我的代码中的问题出在哪里。

第一次调用我的 malloc 时会调用 init() 函数,然后调用 search_for_free_space() 。

我用 mmap 分配了 409600 字节(100 页),但代码在无缘无故地仅使用 26000 字节后出现段错误。

当我将 mmap 的大小乘以 10 时,稍后会出现段错误,但我验证了给我的 mmap 的大小是 409600 并且不少于。

段错误应该仅在使用所有内存后出现,因为我还没有完成代码的下一部分,但它出现得太早了。

代码(您可以运行它):

#include <sys/mman.h>
#include <unistd.h>
#include <stdio.h>

# define PAGE_SIZE getpagesize()

typedef struct s_zone
{
int size;
int free;
struct s_zone *next;
} t_zone;

typedef struct s_e
{
t_zone *tiny;
} t_e;

static t_e g_e;

void *allocate(size_t size)
{
printf("%s", "allocated memory: ");
printf("%d\n", (int)size);
return (mmap(NULL, size, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANON, -1, 0));
}

void *init_tiny(size_t size)
{
g_e.tiny = (t_zone*)allocate((PAGE_SIZE * 100));
g_e.tiny->size = size;
g_e.tiny->free = 0;
g_e.tiny->next = g_e.tiny + sizeof(t_zone) + size;
g_e.tiny->next->size = PAGE_SIZE;
g_e.tiny->next->free = 1;
g_e.tiny->next->next = NULL;
return (g_e.tiny + sizeof(t_zone));
}

void *search_for_free_space(size_t size, t_zone *zone)
{
size_t i;

while (zone->free != 1 || zone->size < size)
zone = zone->next;
zone->free = 0;
zone->size = size;
zone->next = zone + sizeof(t_zone) + size;
zone->next->size = PAGE_SIZE;
zone->next->free = 1;
zone->next->next = NULL;
return (zone + sizeof(t_zone));
}

void *malloc2(size_t size)
{
if (g_e.tiny == NULL)
return (init_tiny(size));
else
return (search_for_free_space(size, g_e.tiny));
return (NULL);
}

int main(void)
{
int i;

i = 0;
while (i < 300)
{
malloc2(2000);
i++;
printf("%s", "used memory: ");
printf("%d\n", (int)((2000 * i) + (i * sizeof(t_zone))));
}
return (0);
}

最佳答案

正如 Mevets 指出的那样,问题确实是

zone + sizeof(t_zone) + size;

要在 zone 的类型为 t_zone * 时将指针增加 sizeof(t_zone) 字节,只需添加 1.即,区域 + 1

然后您需要添加 size 个字符,即

(t_zone *)((char *)(zone + 1) + size)

但是您还必须小心保持tzone结构与其自然对齐方式的对齐;特别是返回的指向 _Alignof (max_align_t) 的指针。如果 tzone 已经以相同的对齐方式自然对齐,或者甚至与 max_align_t 具有相同的大小,则这将是最简单的;如果大小四舍五入到最接近的 max_align_t 倍数。

关于c - 使用 mmap 重新编码 malloc 奇怪的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49999524/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com