我想創建一個函數,獲取一個空指針。這個指針指向一個任意的用戶數據。這與現在無關。描述這個用戶數據的描述符更重要。在這個數據下是。我想它的地址,有兩種不同的解決方案:奇怪的行爲與空指針
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