我试图在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));
其中Order是您可以拥有的不同块大小的数量。
我收到编译错误' FreeList'有一个不完整的类型。
我不希望这些指针指向任何地方,我只是想为数据分配空间。
答案 0 :(得分: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)
,就像我们原来的例子一样。请记住,分配的标头数组仍未初始化。