2010-10-07 54 views
7

我試圖寫一個函數的大小是這樣的:如何查找調用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如何打包標題位?

謝謝,我很欣賞這一點。我確定這段代碼有些問題,它不是特別便攜,可能依賴於系統,但是我爲了好玩而做。

+3

如果你能得到這個工作,它只會在你的'malloc'特定實現上起作用。另一個系統可能會使用一個不同的'malloc',並試圖在向後移動數組後端去引用指針可能會導致內存訪問衝突並導致應用程序崩潰。更可靠的方法是在調用'malloc'時記錄內存區域的大小,並引用該值而不是試圖剖析'malloc'的元數據。 – bta 2010-10-07 23:20:36

+0

不要這樣做。如果您需要知道尺寸,請自行存儲,但在大多數情況下可能無用。請記住,C的高級未來派實現將*不會*將大小存儲在任何可從程序中訪問的位置,不會在指針和整數類型之間進行轉換,並且如果增加或減少指針,則會真正陷入並中止程序超過對象的邊界或嘗試對指向不同對象的指針進行算術運算。該標準允許實施的靈活性有很好的理由。 – 2010-10-08 00:26:59

+1

假設你的'malloc'僅限於分配兩個大小的塊。假設你有一個動態大小的12字節對象數組,並且請求初始容量爲100.如果你用C標準來做事情,當你的數組增長到100個元素時,你必須「重新分配」。如果你能得到塊的實際大小,你可以讓你的數組在重新分配之前增長到170個元素。所以能夠獲得塊的大小有效率優勢。 – dan04 2010-10-08 02:50:55

回答

6

如果你喜歡偷看和超越內存malloc()返回,我建議你獲取你的分配器的源代碼。這比實驗更快,更安全。 ;-)

4

我認爲你依賴於某些實現特定的malloc()行爲。 malloc()的實現是系統特定的,並且specification幾乎沒有提及如何執行此操作。

2

有沒有便攜的方式來做到這一點。正如其他人所說的,要麼是看看你的分配器的代碼,如果你正在做一次性的程序,或者對於一些圖書館(MS)有_msize的擴展。 malloc被允許在分配器中執行它想要的內容來跟蹤內容,並且沒有「安全」或符合標準的獲取數據的方式。

如果您確實需要在真實應用程序中使用此功能,則必須在malloc/free之間構建一個填充分配大小表的墊片。

0

如果你確實想要走這條路線,dlmalloc(在glibc和uClibc上使用的malloc等)有一些文檔在http://g.oswego.edu/dl/html/malloc.html。此外,如何利用堆溢出搜索可能會爲您提供每個平臺的詳細信息,包括沒有可用源代碼的平臺。