我試圖寫一個函數的大小是這樣的:如何查找調用malloc()分配多少空間?
size(void *p,int size);
這將返回這是由p指向數組的大小。例如:
Int *a = malloc((sizeof(int)*100));
size(a,sizeof(int)); // this should return 100
我認爲這是可能的,因爲如果我還記得,malloc的跟蹤在一些頭字節分配的空間。
這是我到目前爲止有:
int size(void *p, int size)
{
p = (unsigned int *)p - 1;
unsigned int elements = (*(unsigned int *)p);
return elements/size;
}
現在,假設分配的空間的大小是在指針之前的4個字節,這應該返回的字節數,或者偏移。這是我在黑暗中的一個地方。我無法弄清malloc如何格式化這些頭字節的細節。 malloc如何打包標題位?
謝謝,我很欣賞這一點。我確定這段代碼有些問題,它不是特別便攜,可能依賴於系統,但是我爲了好玩而做。
如果你能得到這個工作,它只會在你的'malloc'特定實現上起作用。另一個系統可能會使用一個不同的'malloc',並試圖在向後移動數組後端去引用指針可能會導致內存訪問衝突並導致應用程序崩潰。更可靠的方法是在調用'malloc'時記錄內存區域的大小,並引用該值而不是試圖剖析'malloc'的元數據。 – bta 2010-10-07 23:20:36
不要這樣做。如果您需要知道尺寸,請自行存儲,但在大多數情況下可能無用。請記住,C的高級未來派實現將*不會*將大小存儲在任何可從程序中訪問的位置,不會在指針和整數類型之間進行轉換,並且如果增加或減少指針,則會真正陷入並中止程序超過對象的邊界或嘗試對指向不同對象的指針進行算術運算。該標準允許實施的靈活性有很好的理由。 – 2010-10-08 00:26:59
假設你的'malloc'僅限於分配兩個大小的塊。假設你有一個動態大小的12字節對象數組,並且請求初始容量爲100.如果你用C標準來做事情,當你的數組增長到100個元素時,你必須「重新分配」。如果你能得到塊的實際大小,你可以讓你的數組在重新分配之前增長到170個元素。所以能夠獲得塊的大小有效率優勢。 – dan04 2010-10-08 02:50:55