我想创建一个函数,获取一个空指针。这个指针指向一个任意的用户数据。这与现在无关。描述这个用户数据的描述符更重要。在这个数据下是。我想它的地址,有两种不同的解决方案:奇怪的行为与空指针
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指向什么?类型或大小,还是什么? – 2012-04-23 01:44:17
这将是一个内存分配器,ptr传递给用户,所以它可以是任何用户数据。为了组织这些块,描述符存储一些关于这个的信息,大小和前一个和第二个块的指针。当free()来的时候,它只会得到ptr,所以它必须以某种方式获得信息。最简单的方法是将其附加到用户数据。 – 2012-04-23 01:50:33