首页 文章

将元数据添加到内存

提问于
浏览
1

我正在尝试创建一个简单的函数来为堆上的空间分配给定大小的对象以及内部使用的一些额外元数据的空间 .

分配大小x时我想分步做什么:

  • 使用malloc分配,使用malloc分配x sizeof(struct metadata) . Result => start_adr

  • 将元数据分配给start_adr中的第一个字节

  • 返回指向start_adr sizeof的指针(struct metadata)

我在步骤2中遇到问题 . 如何将我的参数meta的值分配给start_adr中的第一个字节?

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)
}

2 回答

  • 2

    你收到一些具体的错误吗?或者你只是不知道怎么做?

    如果我理解正确,它应该像这样简单:

    struct meta_data * foo = ptr;
    foo->data = meta;
    
    return ptr+sizeof(struct meta_data);
    

    阅读仅给出返回的ptr:

    struct meta_data * foo = ptr-sizeof(struct meta_data);
    printf("%hhu\n", foo->data);
    

    还记得在释放时:

    void myFree(void * ptr) {
        void * malloced_ptr = ptr-sizeof(struct meta_data);
        free(malloced_ptr);
    }
    
  • 0

    在分配的内存空间中,它的地址是指向第一个字节的指针 . 因此,您只需要为其分配所需的元数据并将其返回 . 此外,没有必要转换malloc返回(实际上,它是无效*,所以在这种情况下,它无论如何都是毫无意义的) . 请注意,这是有效的,因为meta是unsigned char(即1个字节) . 在其他情况下,您需要将ptr转换为结构元数据*(例如,如果它有更多成员) . 在返回之前也没有必要施放它

    void * myMalloc(int size,unsigned char meta){int meta_sz = sizeof(struct metadata); //元数据的大小void * ptr =(void *)malloc(meta_sz size); //指向我们内存空间的指针

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

    }

    请注意,这可能是一种糟糕的编程习惯,因为它与指向分配的内存空间的指针是指向它的第一个字节的指针相矛盾 . 如果使用指向实际元数据的指针会更好,因为知道分配空间中的第一个字节是元数据 .

相关问题