2010-10-17 58 views
2

任何人都可以提出,我們如何找到使用C的堆的最高地址和最低地址?我們如何找到堆的最高地址和最低地址

+14

你不知道。爲什麼? – GManNickG 2010-10-17 20:56:16

+0

這隻能用於(某些)特定的C實現。不以任何便攜式/標準方式。但是它看起來完全不相關,你在尋找'available_memory()'還是其他的東西? – 2010-10-17 21:07:32

+0

如果這僅僅是爲了學術興趣,而不是我*假設*,你可以迭代malloc和free,直到你發現在malloc開始失敗之前可以分配的最大單塊。你的堆開始將是(大約)該塊的開始地址,並且堆結束將是(大約)開始地址+塊的大小。儘管如此,這對某些體系結構會失敗。 32位Mac OS X,在堆中間有一個島(dylib在這裏居住)。 – 2010-10-17 21:15:03

回答

5

在Linux系統上,可以使用帶有0參數的sbrk()來查找一端。您可以通過了解程序加載程序的段順序並檢查etext和edata來查找另一端 - 請參閱end(3)手冊頁。

所有這些都是非標準的,並且超出了C本身的範圍。

1

答案是你不能在C中。如果你檢查語言標準,你會注意到這個概念從未被提及。

堆是一些在某些操作環境中使用的實現細節(幾乎所有的都可以)。

2

你可以換您的來電malloc保持在每次呼叫迄今所看到的最低和最高地址的軌跡:

extern unsigned char *lowest, *highest; 
unsigned char *tmp = malloc(size); 
if (!tmp) return 0; 
if (!lowest || tmp < lowest) lowest = tmp; 
if (tmp+size > highest) highest = tmp; 
return tmp;