简单来说,我们正在尝试编写一些分配例程(unsigned char 类型),其中每个分配的 block 都有一些与之关联的控制信息。我们并不是要编写一个成熟的内存管理器,而是有一些特定的要求
我们的控制结构示例
typedef struct _control_data
{
u8 is_segment;
:
:
:
struct _control_data* next;
}control_data;
当用户调用 alloc 获取大小 40 时,我们将分配
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;
}
上述访问合法且可移植吗?
最佳答案
是的,这应该没问题,并且是一种常用技术。
几点:
- Don't cast the return value of
malloc()
in C . - 使用指针算术对你有利:
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
的数组),这可能在一般情况下是一个问题。
关于c - 将控制信息与分配的内存一起存储。它是可移植的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19230425/