【发布时间】:2012-04-23 01:41:10
【问题描述】:
我想创建一个获取 void 指针的函数。该指针指向任意用户数据。这与现在无关。哪个描述符更重要,它描述了这个用户数据。 在此数据下。我想得到它的地址,有两种不同的解决方案:
struct data_desc {
size_t size;
data_type_t type;
/* And so on... */
};
/* Operate on the descriptor */
void operate_on_data(void *ptr)
{
struct data_desc *desc;
/* Now I want to get the desc /*
/* This is the first approach, simply fails */
desc = ((struct data_desc *)ptr) - sizeof(struct data_desc);
/* This is the second, it works...*/
desc = (struct data_desc *)ptr;
desc--;
/* Do something with desc */
}
如您所见,我使用两种不同的方法获取描述符的地址。我认为第一个更自然,但它只是行不通。我使用了更多的括号来避免优先级问题。
我知道这些方法不安全。 第一个不起作用,为什么?这种行为背后的原因是什么?
提前致谢!
【问题讨论】:
-
你能澄清一些事情吗? ptr 指向什么?输入或大小,还是什么?
-
这将是一个内存分配器,将ptr传递给用户,所以它可以是任何用户数据。为了组织这些块,描述符存储一些关于这个、大小以及前一个和第二个块的指针的信息。当 free() 来的时候,它只获取 ptr,所以它必须以某种方式获取信息。最简单的方法是将其附加到用户数据。