【发布时间】:2018-02-23 13:38:27
【问题描述】:
我正在阅读关于malloc(first-fit)实现的脚本,我对元数据结构的值分配有点困惑。谁能解释为什么malloc 返回flag_block->ptr(作为分配内存的指针)?据我所知,它没有具体的任务。
typedef struct _metadata {
size_t size;
char free;
struct _metadata* next;
struct _metadata* prev;
char ptr[];
} metadata;
metadata* flag_block = NULL;
void *malloc(size_t size)
{
if (size==0) {
return NULL;
}
if (flag_block == NULL) {
flag_block = sbrk(size);
sbrk(sizeof(metadata));
if (flag_block == (void *)-1) {
return NULL;
}
flag_block->free = 0;
flag_block->next=NULL;
flag_block->prev=NULL;
flag_block->size = size;
return flag_block->ptr;
} else {
/*
....
*/
}
}
【问题讨论】:
-
代码有小错误:
sbrk(sizeof(metadata));的返回值未检查。 -
此代码的另一个微妙弱点:
char ptr[];的类型除了其对齐之外影响不大。malloc()应该返回一个指针,其 alignment 在所有上下文中都有效。char ptr[];不提供。替代方案:使用max_align_t ptr[]。