在C中初始化数据结构以管理内存池

时间:2011-03-07 20:10:00

标签: c memory malloc calloc

我正在为一个库编写一个简单的函数,它将把我的其他函数管理的内存大小作为参数。

我有一个数据结构,用于保存用户初始化的大型内存池的信息。

typedef struct memBlock{
    struct memBlock* next;
    unsigned int size;  // Size of this block
    unsigned int is_used;  // bool 0 = not used 1 = used
}  memBlock;

我也有这个功能,我试图弄清楚如何初始化这个数据结构以及分配足够的空间来进行管理?

int initialize_memory(unsigned long size){

    memBlock *ptr; // the beginning of our whole memory to be handled

    ptr = malloc(size); // this is the ptr to the original memory first allocated.
    ptr->next = NULL;
    ptr->size = NULL;
    ptr->is_used = 0;

    has_initialized = 1; // the memory has been initialized
}

请帮助

2 个答案:

答案 0 :(得分:1)

ptr->size = NULL;更改为ptr->size = size;。您还需要返回ptr,或将其存储在某处。您的函数返回int,但您不返回任何内容。 has_initialized似乎没必要 - 您知道自己已初始化,因为您的内存池(您将返回的ptr值)不是NULL。如果你需要更多的帮助,你将需要解释更多。

附录:您需要确定memBlock.size是否是已分配空间的大小或memBlock表示的内存块的大小...如果是后者,那么您需要考虑memblock占用的空间通过减去你分配的空间量来减少它:ptr->size = size - sizeof(struct memBlock);你还需要一种方法来解决你的内存池...因为它紧跟在memBlock之后,它的地址是(ptr + 1)或{{1} (如果你不明白,请查看“C中的指针算术”)。

P.S。您在评论中写道“基本上我还有另一个函数,它将像'malloc'一样保留一些字节,但会首先检查这个数据结构,看看我的池中是否有任何内存可用”

你为什么要这样做?考虑到技能水平和投入的时间,malloc已经比你的功能更好地管理内存了,并且在它之上分层另一个内存分配器是没有意义的。除非这是一个编写内存分配器的学校项目,否则你应该事先说出来。

答案 1 :(得分:0)

typedef struct memBlock {
   unsigned int size;
   unsigned int initialized;
   void* block;
} memBlock;

memBlock* new_memBlock(unsigned int size)
{
    memBlock* memblock;

    memblock = malloc(sizeof(memBlock));

    if (memblock)
    {
        memblock->size = size;
        memblock->block = malloc(size);

        if (memblock->block)
            memblock->initialized = 1;
    }

    return memblock;
}

void free_memBlock(memBlock** memblock)
{
    if (*memblock)
    {
        free(*memblock->block)
        *memblock->block = 0;
    }

    free(*memblock);
    *memblock = 0;
}

void main()
{
    memBlock* memblock = new_memBlock(1024);

    if (memblock && memblock->initialized)
        printf("Initialized\n");
    else
        printf("Not initialized\n");

    free_memBlock(&memblock);
}