我需要一些作业方面的帮助。我的工作是使用"仅在自由块中显式自由列表"技术在 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。(我看到这种技术在隐式列表中使用(。所以我的问题是:我是否需要为显式列表创建一个freeBlock
和allocatedBlock
结构,或者我可以只使用大小的一位?
第二个问题是:我是否需要为块的页眉/页脚提供单独的结构?或者我可以只将页眉/页脚中的块的大小写为*(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;
注意:由于指针(看似(复杂,请将编译器的警告级别提高到最大。阅读所有警告并消除其原因。