0

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

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

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
}

请帮忙

4

2 回答 2

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)&ptr[1](如果你不明白,请查找“C中的指针算术” )。

PS 你在评论中写道“基本上我还有另一个函数,它的作用类似于'malloc'来保留一些字节,但会首先检查这个数据结构,看看我的池中是否有可用的内存”

你为什么要这样做?考虑到技能水平和投入的时间,malloc 已经比您的函数更好地管理内存,并且在其上分层另一个内存分配器是没有意义的。除非这是一个编写内存分配器的学校项目,在这种情况下你应该提前说出来。

于 2011-03-07T20:43:46.430 回答
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);
}
于 2011-03-07T20:52:34.453 回答