结构指针数组的内存分配

我正在尝试在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’的类型不完整。

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

用C语言

 struct Header *FreeList[]; 

是一个未知大小的静态数组(不完整类型)的暂定定义。 稍后应使用已知的编译时大小定义此数组。 关键是它是一个静态数组。 它不是由malloc “可分配”的。

如果你需要一个可以在运行时由malloc分配的指针数组,你必须声明一个指向指针的变量

 struct Header **FreeList; 

后者分配适当的大小

 FreeList = malloc(Order * sizeof *FreeList); 

请注意,在这种情况下,您正在分配一个指针数组,就像您想要的那样。 并且上面分配中的sizeof(struct Header *)等同于sizeof(struct Header *) 。 即指针的大小(与原始代码中的不正确sizeof(struct Header)相对)。

这再次分配了一个未初始化的指针数组。 您有责任初始化这些指针,即使它们指向您希望它们指向的任何位置。 如有必要,您还必须为实际标头分配内存。


但是,您发布的内容是否确实需要一个指向标题的数组或者可能是一组实际标题 ,这一点并不十分清楚。 你的解释令人困惑,有时甚至是自相矛盾的。 如果需要一个实际标头数组,那么指针声明和分配将如下所示

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

在这种情况下,上面的sizeof表达式等同于sizeof(struct Header) ,就像在我们的原始示例中一样。 请记住,分配的标头数组仍未初始化。