我正在尝试创建一个简单的函数来为堆上的空间分配给定大小的对象以及内部使用的一些额外元数据的空间。
分配大小x时,我想分步做什么:
我在第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)
}
答案 0 :(得分: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);
}
答案 1 :(得分: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)
}
请注意,这可能是一种糟糕的编程习惯,因为它与指向分配的内存空间的指针是指向它的第一个字节的指针相矛盾。如果使用指向实际元数据的指针会更好,因为知道分配空间中的第一个字节是元数据。