void func(int *p)
{
// Add code to print MEMORY SIZE which is pointed by pointer P.
}
int main()
{
int *p = (int *) malloc (10);
func(p);
}
如何從func()中的內存指針P中找到MEMORY SIZE?如何從給定的內存指針找到MEMORY SIZE?
void func(int *p)
{
// Add code to print MEMORY SIZE which is pointed by pointer P.
}
int main()
{
int *p = (int *) malloc (10);
func(p);
}
如何從func()中的內存指針P中找到MEMORY SIZE?如何從給定的內存指針找到MEMORY SIZE?
沒有合法的方法來做到這一點在C(甚至C + +我相信)。是的,在某種程度上free
知道有多少是malloc
ed,但它以一種程序員不可見或不可訪問的方式進行。對你來說,程序員,它可能已經做到了魔術!
如果您決定嘗試解碼malloc和free是什麼,那麼它會引導您走向專有編譯器實現的道路。需要警告的是,即使在同一個操作系統上,不同的編譯器(甚至是相同編譯器的不同版本,甚至是相同的編譯器,但使用第三方malloc實現(是的,這樣的事情存在))都可以做不同的事情。
甚至是相同的編譯器,但使用不同的編譯標誌!好的答案,但我也建議包裝'malloc()'(即寫和使用'my_ * alloc()'和'my_free()'。) – aib 2010-10-03 20:49:56
如果您的程序爲Microsoft Windows,則可以使用Windows API Heap *函數而不是您的編程語言(在您的情況下爲C)提供的函數。您使用HeapAlloc
分配內存,使用HeapReAlloc
重新分配內存,使用HeapFree
釋放內存,最後使用HeapSize
函數獲得先前分配的塊的大小。
當然,另一種選擇是爲malloc
和朋友編寫包裝函數,這些函數存儲已分配塊的索引及其大小。這樣,您可以使用自己的函數來分配,重新分配,釋放和測量內存塊。編寫這樣的包裝函數應該是微不足道的(雖然我不知道C,所以我不能爲你做......)。
我希望每個分配的速度比使用堆的C運行時庫,而且對於小的分配是浪費的。 – ChrisW 2010-10-03 21:19:26
開發應用程序時,要知道分配給一個指針的內存大小,我們實際上是在此刻關注我們分配內存的它,而你的情況是:
int *p = (int *) malloc(10);
,然後我們存儲這些信息如果我們將來需要使用它的話。事情是這樣的:
void func(int *p, size_t size)
{
printf("Memory address 0x%x has %d bytes allocated for it!\n", p, size);
}
int main()
{
int my_bytes = 10;
int *p = malloc(my_bytes);
func(p, my_bytes);
return 0;
}
對於一個非常簡單或者人爲的例子來說,這很好,但是如果你的程序有數千或者數百萬的內存分配,你的存儲指針和長度的機制更好*效率很高。 – 2010-10-03 19:39:41
我指出了這一點,僅僅是因爲我認爲@siva可能會用錯誤的方式來解決他的問題。 – karlphillip 2010-10-03 19:45:06
我很想知道爲什麼這個答案被拒絕。請?國際海事組織,答案反映了我們日常的現實。我懷疑大多數C程序員會給出不同的答案。 – jweyrich 2010-10-03 19:57:53
很多年前,我編程的類UNIX系統,該系統有一個msize
STDLIB函數將返回幾乎你想要的東西上。不幸的是,它從未成爲任何標準的一部分。
msize
叫上一個指針從malloc
或realloc
返回將在該地址返回系統已經爲用戶程序分配的內存的實際量(比請求,這可能是更多,如果它得到了四捨五入的對齊原因或無論如何)。
MSVC支持_msize也是CRT的一部分:http://msdn.microsoft.com/en-us/library/z2s077bc(v=VS.80).aspx – Necrolis 2010-10-05 12:15:33
首先,正如所有其他人所說的,除非您保留這些信息,否則沒有便捷的方法可以知道分配的大小。
重要的是標準C庫的實現。大多數庫只保留分配給指針的內存大小,該指針通常大於程序請求的大小。讓圖書館保持所需的大小是一個不好的主意,因爲這會花費額外的內存,有時我們不關心所需的大小。
嚴格來說,記錄所請求的大小並不是編譯器的一個特性。這似乎有時是因爲編譯器可能會重新實現標準庫的一部分並覆蓋系統默認值。但是,我不會使用記錄請求大小的庫,因爲我之前說過的原因可能會佔用更大的內存。
你不能以便攜的方式做到這一點。 – 2010-10-03 18:34:02
上面的代碼片段中沒有「P」。如果你需要的話(或者有一個停止值),你必須將這個大小傳遞給函數 – pmg 2010-10-03 18:39:59
我們可以從存儲器指針P(P-1)指向內存塊頭和*(P -1)給你分配的內存大小。注意:*(P-1)不會給你確切的內存大小,但它會給出「分配的內存+內存塊頭大小+內存塊尾大小」 – siva 2010-10-05 18:35:08