非常简单地说,我们正在尝试编写一些分配例程(unsigned char类型),其中每个已分配的块都有一些与之关联的控制信息。我们不是要编写一个完整的内存管理器,但有一些特定的要求
我们的控制结构样本
typedef struct _control_data
{
u8 is_segment;
:
:
:
struct _control_data* next;
}control_data;
当用户为大小40调用alloc时,我们将分配
unsigned char* data_ptr = (unsigned char*)malloc(sizeof(control_data) + size);
return(&data_ptr[sizeof(control_data]);
稍后用户将传递在alloc期间返回的指针,并且我们想要访问控制信息。
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;
}
以上访问权限是否合法且便携?
答案 0 :(得分: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 *
指针来存储返回的值。
UPDATE :正如评论中指出的那样,这会忽略对齐(因为你说非控件数据是unsigned char
的数组,这感觉很安全)这可能是一个问题。一般情况。