0

非常简单地说,我们正在尝试编写一些分配例程(类型为 unsigned char),其中每个分配的块都有一些与之关联的控制信息。我们不是在尝试编写一个完整的内存管理器,而是有一些特定的要求

我们的控制结构示例

typedef struct _control_data
{
   u8 is_segment;
   :
   :
   :
   struct _control_data* next;
}control_data;

当用户为 size 40 调用 alloc 时,我们将分配

  unsigned char* data_ptr = (unsigned char*)malloc(sizeof(control_data) + size);
  return(&data_ptr[sizeof(control_data]);

稍后用户将传递分配期间返回的指针,我们要访问控制信息。

void do_some_processing(unsigned char* data_ptr)
   {
      struct control_data* c_ptr = (data_ptr - sizeof(control_data));
      c_ptr->is_segment = TRUE;
      c_ptr->next       = NULL;
   }

上述访问是否合法且可移植?

4

1 回答 1

1

是的,它应该没问题,并且是一种常用技术。

几点:

void * my_alloc(size_t size)
{
    control_data *cd = malloc(size + sizeof *cd);
    if(cd != NULL)
      return cd + 1;
    return NULL;
}

+ 1做完全正确的事情,但更简单。使分配“键入”也没有意义;让它返回void *并留给调用者使用unsigned char *指针来存储返回的值。

更新:正如评论中所指出的,这忽略了对齐(这感觉很安全,因为你说非控制数据是一个数组unsigned char),这在一般情况下可能是一个问题。

于 2013-10-07T16:58:10.473 回答