c - 将控制信息与分配的内存一起存储。它是可移植的吗?

标签 c malloc

简单来说,我们正在尝试编写一些分配例程(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;
   }

上述访问合法且可移植吗?

最佳答案

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

几点:

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/

相关文章:

在 Linux 中使用 makefile 编译内核模块

c++ - malloc 中的段错误 :

c - HTTP 服务器发送带有响应的新请求

c - 在程序中求解两个线性方程

c - 在函数内部重新分配数组结构

c - Malloc 不创建内存

stddev/mean 的 C 程序

c - 在结构中动态分配字符串

c - 这段代码在 GCC 中意味着什么?

performance - 内存分配/释放瓶颈?