【问题标题】:Memory allocation for array of structure pointers结构指针数组的内存分配
【发布时间】:2012-07-10 10:26:56
【问题描述】:

我正在尝试在 C 中构建一个内存分配器。用户首先说他想要使用多少内存,以及可以使用的最小内存块大小。

因此,例如,假设用户请求 1024B,最小块大小为 8B。 这意味着可能的块大小为 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”的类型不完整。

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

【问题讨论】:

  • 这是真正的代码吗?您在结构定义的末尾缺少 ; 。另外,如果它是一个指针数组,那么数组的大小是多少?为什么没有在索引中指定任何内容?
  • Header 的定义是否包含在执行分配的翻译单元 (.c) 中?如果不是,Header 只能用作指针——编译器不知道它的大小。
  • 是的,这都在同一个 .c 文件中。

标签: c arrays pointers memory-management


【解决方案1】:

C语言

struct Header *FreeList[];

是对未知大小(不完整类型)的静态数组的暂定定义。这个数组应该稍后用已知的编译时大小来定义。关键是它是一个 static 数组。 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),就像我们原来的例子一样。请记住,分配的标头数组仍未初始化。

【讨论】:

  • 谢谢你的作品。我只需要一个指向标头的指针数组。标头本身在用户内存中。
猜你喜欢
  • 2023-04-02
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
  • 2015-04-16
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多