我正在尝试用C语言构建一个内存分配器。用户首先说明他想要使用多少内存,以及可以使用的最小内存块大小。
例如,假设用户请求最小块大小为8B的1024B。这意味着可能的块大小为1024、512、256、128、64、32、16和8。
为了跟踪空闲的内存块,我有一个指向结构的指针数组。这些结构称为Header,数组称为FreeList。我的意思是,FreeList将包含指向内存中内存大小为8的块的空间的指针。FreeList1将包含指向内存中存在内存大小为16的块的空间的指针。
typedef void * Addr;
struct Header
{
Addr next;
int order;
};
struct Header *FreeList[];我正在尝试为这个空闲列表分配内存,以便与以下代码一起使用:
FreeList = malloc(Order*sizeof(struct Header));其中Order是您可以拥有的不同块大小的数量。
我得到编译错误'FreeList‘有一个不完整的类型。
我还不想让这些指针指向任何地方,我只想为数据分配空间。
发布于 2012-07-11 05:09:10
在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),就像我们最初的例子一样。但请记住,分配的标头数组仍未初始化。
https://stackoverflow.com/questions/11421884
复制相似问题