【问题标题】:Usage of Structures in CC中结构的使用
【发布时间】: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[]

标签: c struct malloc


【解决方案1】:

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

所以基本上是这样的:

return flag_block->ptr;

等价于

return &flag_block->ptr[0];

所以它返回struct中其余成员之后的第一个字节的地址。

【讨论】:

  • 注意sizeof(metadata) 不包括FAM char ptr[]; 的大小,但确实包括char ptr[]; 之前的填充(如果有)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 2015-12-11
相关资源
最近更新 更多