我对内存池实现感到困惑。我创建了一个内存池:
typedef struct POOL
{
struct POOL *p_next;
unsigned short size;
unsigned short used;
}pool;
pool *p;
p=malloc(pool_size+sizeof(pool));
p->size= pool_size;
p->used= 0;
现在我想用block_size将这个内存池分成块,所以
typedef struct BLOCK
{
unsigned short size;
struct BLOCK *b_next;
}block;
block *b=NULL;
b=(block *)&p[block_size+sizeof(block)];
b->size=block_size;
memset(b,0,size+sizeof(block));
p->used+=(size+sizeof(block));
现在我想使用块b的内存,所以我只是用它作为
strcpy(b, "hello, world!");
我正确地做到了吗?我该如何解决这个问题?
答案 0 :(得分:0)
以下
b=(block *)&p[block_size+sizeof(block)];
p
是指向pool
的指针,因此当您对其使用数组索引时,偏移量将乘以pool
结构的大小。这可能不是你想要的。您可能想要跳过池结构,这只是
p+1
我不知道你打算用什么政策来分割池头之后的内存,或者你打算如何处理对齐要求,所以我不能说你还需要什么额外的补偿
接下来,在块结构中填写块大小,然后使用memset
继续擦除整个内容。
因此,在不知道您尝试实现哪种池分配器的情况下,我能做的最好的就是回答您的实际问题,答案是否定的,您没有正确地执行此操作。