2012-07-10 95 views
1

我想在C中建立一个内存分配器。用户开始说他要使用多少内存,以及可用内存的最小块大小。内存分配的结构指针阵列

因此,例如,假设用户请求具有8B的最小块大小的1024B。 这意味着可能的块大小将是1024,512,256,128,64,32,16和8.

为了跟踪内存的空闲块,我有一个指向结构的指针数组。这些结构被称为Header,并且该数组被称为FreeList。 我的意思是说,FreeList [0]将包含一个指向内存中存在大小为8的内存空间的指针.FreeList [1]将包含一个指向内存空间的指针,其中有一块内存大小16.等

typedef void * Addr; 
struct Header 
{ 
    Addr next; 
    int order; 
}; 

struct Header *FreeList[]; 

我想分配内存此空闲列表下面的代码使用方法:

FreeList = malloc(Order*sizeof(struct Header)); 

哪里订单是您可以有不同的块大小的数量。

我收到编译错误'FreeList'有一个不完整的类型。

我不希望这些指针指向任何地方,我只是想分配数据空间。

+2

这是真码吗?您在结构定义的末尾缺少';'。如果它是一个指针数组,那么数组的大小是多少?为什么你没有在索引中指定任何内容? – Mahesh 2012-07-10 21:03:47

+0

我很抱歉。错字。修复。 – user1515928 2012-07-10 21:05:30

+0

是否包含在执行分配的翻译单元(.c)中的“Header”的定义?如果不是,'Header'只能用作指针 - 编译器不知道它的大小。 – eran 2012-07-10 21:06:19

回答

7

在C语言

struct Header *FreeList[]; 

为未知大小(不完全型)的静态阵列的暂定定义。这个数组应该稍后用已知的编译时间大小来定义。重点是它是一个静态阵列。它不是由malloc“可分配”。

如果需要,可以在运行时通过malloc分配指针数组,必须声明指针到指针变量

struct Header **FreeList; 

其是后者具有适当大小

分配
FreeList = malloc(Order * sizeof *FreeList); 

请注意,在这种情况下,您正在分配一组指针,就像您想要的一样。而上述分配中的sizeof相当于sizeof(struct Header *)。即指针的大小(而不是原始代码中的错误sizeof(struct Header))。

这又一次分配了未初始化指针的数组。初始化这些指针是你的责任,也就是让它们指向任何你希望它们指向的地方。如有必要,您还必须为实际标题分配内存。


然而,这是不是从你贴什么真正清楚是否真的需要的指针数组头或者,也许,的真实头部的数组。你的解释很混乱,有时会自相矛盾。如果你需要实际的头的数组,然后将鼠标指针的声明和分配将如下所示

struct Header *FreeList; 
... 
FreeList = malloc(Order * sizeof *FreeList); 

在这种情况下sizeof表达上述相当于sizeof(struct Header),在我们原来的例子。请记住,分配的标题数组尚未初始化。

+0

谢谢你的作品。 我只需要一个指向数组的指针数组。标题本身在用户内存中。 – user1515928 2012-07-10 21:14:04