我试图创建一个简单的函数,以便为给定大小的对象分配堆上的空间,以及内部使用的一些额外的元数据的空间。
在分配大小x时,我要分步骤做的事情:
步骤2有问题。如何将参数元的值分配到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)
}发布于 2013-11-26 19:27:17
你有什么特别的错误吗?还是你只是不知道怎么做?
如果我的理解是正确的,它应该是如此简单:
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);
}发布于 2013-11-26 19:32:16
在分配的内存空间中,它的入口是指向第一个字节的指针。因此,您只需要为它分配所需的元数据并将其返回。此外,不需要转换malloc返回(实际上,它是空的*,所以在这种情况下它是没有意义的)。请注意,这是因为元是无符号字符(即1字节)。在其他情况下,需要将ptr转换为struct元数据*(例如,如果它有更多的成员)。还没有必要在返回前抛出它。
{ int meta_sz = size of (struct元数据);// size *ptr = (void *)malloc(meta_sz + size);//指针指向内存中的空间
*ptr = meta;
return (ptr + meta_sz); // return memory slot (with meta exluded)}
请注意,这可能是一种糟糕的编程实践,因为它与指向分配内存空间的指针是指向其第一个字节的指针的约定相矛盾。最好使用指向实际元数据的指针,因为您知道分配空间中的第一个字节是元数据。
https://stackoverflow.com/questions/20226130
复制相似问题