C语言 显式自由列表(动态内存分配)



我需要一些作业方面的帮助。我的工作是使用"仅在自由块中显式自由列表"技术在 C 中创建/实现 malloc/free 函数。我已经研究了很多材料,但我仍然停留在某个时候,我不了解一些细节。所以我的工作是创建 4 个函数 – initialize((、allocate((、free(( 和 check((。我只能使用一个全局变量void *memory– 这是我可以使用 alloc(( 分配内存的块。

所以我想使用双链表来实现这一点,我创建了一个结构:

typedef struct memoryBlock{
struct memoryBlock *prev,*next;
}memoryBlock;

以及标头的结构:

typedef struct header{
int size;
}header;

在我的课堂上,有人建议我为空闲内存块创建一个单独的结构,为分配的块创建一个单独的结构。我的第一个想法是使用标头中的块大小的一位来区分空闲/分配的块——如果块已分配,则将其设置为 1,如果块空闲,则设置为 0。(我看到这种技术在隐式列表中使用(。所以我的问题是:我是否需要为显式列表创建一个freeBlockallocatedBlock结构,或者我可以只使用大小的一位?

第二个问题是:我是否需要为块的页眉/页脚提供单独的结构?或者我可以只将页眉/页脚中的块的大小写为*(int *)ptr = size;?我尝试在 initialize(( 函数中使用它:

void initialize(void *ptr, int size){
memory = ptr;
*(int *)memory = size; //header
*((int *)memory + size) = size; //footer
}

请问这是对的吗?

非常感谢任何帮助。

我需要为显式列表创建一个freeBlock和分配的Block结构吗?

这听起来像是一个非常好的主意。只是不要误解建议:您不需要两个不同的结构定义,而是两个不同的列表。您可以通过两个指针来实现这一点,一个用于空闲块,一个用于分配块。

[...]我可以只使用尺寸的一点吗?

如果未使用,则只能使用一位大小。如果选择位 0,则仅当只分配偶数个内存字时,它才有效。

我是否需要为块的页眉/页脚提供单独的结构?

这取决于您的设计和算法。您是否必须创建页眉和页脚?

或者我可以只将页眉/页脚中的块的大小写为*(int *)ptr = size;

你可以这样做。但是我会将给定的指针分配给指向右侧结构的(临时(指针,然后在它们的位置分配值。

void initialize(void *ptr, int size) {
memory = ptr;
header* h = memory;
h->size = size;
}

附加观察:而不是

typedef struct memoryBlock{
struct memoryBlock *prev,*next;
}memoryBlock;

最好习惯这个,它会为你节省很多拔掉的头发:

typedef struct memoryBlock {
struct memoryBlock *prev;
struct memoryBlock *next;
} memoryBlock;

注意:由于指针(看似(复杂,请将编译器的警告级别提高到最大。阅读所有警告并消除其原因。

相关内容

  • 没有找到相关文章

最新更新