首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >结构指针数组的内存分配

结构指针数组的内存分配
EN

Stack Overflow用户
提问于 2012-07-11 05:01:47
回答 1查看 8.1K关注 0票数 1

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

例如,假设用户请求最小块大小为8B的1024B。这意味着可能的块大小为1024、512、256、128、64、32、16和8。

为了跟踪空闲的内存块,我有一个指向结构的指针数组。这些结构称为Header,数组称为FreeList。我的意思是,FreeList将包含指向内存中内存大小为8的块的空间的指针。FreeList1将包含指向内存中存在内存大小为16的块的空间的指针。

代码语言:javascript
复制
typedef void * Addr;
struct Header
{
    Addr next;
    int order;
};

struct Header *FreeList[];

我正在尝试为这个空闲列表分配内存,以便与以下代码一起使用:

代码语言:javascript
复制
FreeList = malloc(Order*sizeof(struct Header));

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

我得到编译错误'FreeList‘有一个不完整的类型。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-11 05:09:10

在C语言中

代码语言:javascript
复制
struct Header *FreeList[];

是未知大小(不完整类型)的静态数组的暂定定义。这个数组应该在以后用已知的编译时大小来定义。关键是它是一个静态数组。它不能被malloc“分配”。

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

代码语言:javascript
复制
struct Header **FreeList;

,后者分配了适当的大小。

代码语言:javascript
复制
FreeList = malloc(Order * sizeof *FreeList);

请注意,在本例中,您分配的是一个指针数组,就像您希望的那样。上述分配中的sizeof等同于sizeof(struct Header *)。即指针的大小(与原始代码中不正确的sizeof(struct Header)相反)。

这又一次分配了一个未初始化指针数组。初始化这些指针是你的责任,也就是说,让它们指向你想要它们指向的任何地方。如果有必要,您还必须为实际的头文件分配内存。

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

代码语言:javascript
复制
struct Header *FreeList;
...
FreeList = malloc(Order * sizeof *FreeList);

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11421884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档