首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向内存中添加元数据

向内存中添加元数据
EN

Stack Overflow用户
提问于 2013-11-26 19:24:06
回答 2查看 1.5K关注 0票数 1

我试图创建一个简单的函数,以便为给定大小的对象分配堆上的空间,以及内部使用的一些额外的元数据的空间。

在分配大小x时,我要分步骤做的事情:

  1. 使用malloc分配分配,使用malloc分配x+ sizeof(struct元数据)。结果=> start_adr
  2. 将元数据分配给start_adr中的第一个字节
  3. 返回指向start_adr +sizeof(结构元数据)的指针

步骤2有问题。如何将参数元的值分配到start_adr中的第一个字节?

代码语言:javascript
复制
struct metadata{
    unsigned char data;
};

void *myMalloc(int size, unsigned char meta){
    int meta_sz = sizeof(struct metadata);      // size of metadata
    void *ptr = (void *)malloc(meta_sz + size); //pointer to our space in memory

    //Magic code for assigning meta here

    return (void *)(ptr + meta_sz); // return memory slot (with meta exluded)
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-26 19:27:17

你有什么特别的错误吗?还是你只是不知道怎么做?

如果我的理解是正确的,它应该是如此简单:

代码语言:javascript
复制
struct meta_data * foo = ptr;
foo->data = meta;

return ptr+sizeof(struct meta_data);

只读取返回的ptr:

代码语言:javascript
复制
struct meta_data * foo = ptr-sizeof(struct meta_data);
printf("%hhu\n", foo->data);

请记住,解放时:

代码语言:javascript
复制
void myFree(void * ptr) {
    void * malloced_ptr = ptr-sizeof(struct meta_data);
    free(malloced_ptr);
}
票数 2
EN

Stack Overflow用户

发布于 2013-11-26 19:32:16

在分配的内存空间中,它的入口是指向第一个字节的指针。因此,您只需要为它分配所需的元数据并将其返回。此外,不需要转换malloc返回(实际上,它是空的*,所以在这种情况下它是没有意义的)。请注意,这是因为元是无符号字符(即1字节)。在其他情况下,需要将ptr转换为struct元数据*(例如,如果它有更多的成员)。还没有必要在返回前抛出它。

{ int meta_sz = size of (struct元数据);// size *ptr = (void *)malloc(meta_sz + size);//指针指向内存中的空间

代码语言:javascript
复制
*ptr = meta;

return (ptr + meta_sz); // return memory slot (with meta exluded)

}

请注意,这可能是一种糟糕的编程实践,因为它与指向分配内存空间的指针是指向其第一个字节的指针的约定相矛盾。最好使用指向实际元数据的指针,因为您知道分配空间中的第一个字节是元数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20226130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档