在C语言中使用结构体

7

我正在阅读有关实现malloc(首次适应)的脚本,对元数据结构中值的赋值有些困惑。是否有人可以解释一下为什么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 {

    /* 
        ....
    */

    }
}

相关:为什么需要一个零元素的数组? - Sergey Kalinichenko
代码有小错误:未检查sbrk(sizeof(metadata));的返回值。 - chux - Reinstate Monica
这段代码还有一个微妙的弱点:char ptr[]; 的类型除了它的对齐方式外并不重要。malloc() 应该返回一个在所有上下文中都有效的指针对齐方式。而 char ptr[]; 并不能提供这种对齐方式。替代方案是:使用 max_align_t ptr[] - chux - Reinstate Monica
1个回答

6
ptr被称为灵活数组成员;它是一个没有大小的数组,并且只能出现在struct的末尾。

所以基本上就是这样:

return flag_block->ptr;

等同于

return &flag_block->ptr[0];

因此,它返回的是struct中其余成员之后第一个字节的地址。


需要注意的是 sizeof(metadata) 不包括 FAM char ptr[]; 的大小,但如果在 char ptr[]; 之前有填充,则会包括填充的大小。 - chux - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接