结构指针数组的内存分配

use*_*928 1 c arrays pointers memory-management

我正在尝试在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[];
Run Code Online (Sandbox Code Playgroud)

我正在尝试为此空闲列表分配内存以使用以下代码:

FreeList = malloc(Order*sizeof(struct Header));
Run Code Online (Sandbox Code Playgroud)

其中Order是您可以拥有的不同块大小的数量.

我收到编译错误'FreeList'的类型不完整.

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

AnT*_*AnT 7

用C语言

struct Header *FreeList[];
Run Code Online (Sandbox Code Playgroud)

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

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

struct Header **FreeList;
Run Code Online (Sandbox Code Playgroud)

后者分配适当的大小

FreeList = malloc(Order * sizeof *FreeList);
Run Code Online (Sandbox Code Playgroud)

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

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


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

struct Header *FreeList;
...
FreeList = malloc(Order * sizeof *FreeList);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,sizeof上面的表达式sizeof(struct Header)与我们原始示例中的表达式相同.请记住,分配的标头数组仍未初始化.