如何知道堆结尾的地址?

时间:2011-01-21 05:03:06

标签: c

感谢您的回复和回答。这个问题被编辑了,因为看起来我之前的所有问题都非常模糊,并没有详细说明我想要达到的目标和目标。

更新了问题:

在Linux平台中使用C语言,有哪些可能的方法来确定我的应用程序中使用的堆的大小。比如.. ..

void printHeapReport( )
{
   /* implementation here to print the heap size */
}

int main()
{
    char *ptemp = NULL;
    p = (char*)malloc( 10 ); /* 10 bytes */

    printHeapReport();

    return 0;
}

应用程序将在标准输出屏幕中输出:

Debug Report:  
--------------  
Heap: 10 bytes  
--------------  

我问这个是因为我想在应用程序中创建一个打印堆大小的调试报告。

请建议。

非常感谢。


旧问题:

使用C asm内联函数,是否可以知道堆的起始地址和堆的结尾?也是程序结束的地址?

asm( <assembly code> );

因此,使用此代码,我可以确定应用程序中使用的堆的大小。这种方法对于确定堆的大小是否有效?

请建议。

非常感谢。

3 个答案:

答案 0 :(得分:4)

您必须至少指定您正在处理的平台,并在许多平台上实现这个问题并没有真正的答案。 'heap'不需要是连续的 - 在很多情况下,对于不同类型的对象(如某些大小的请求)将有几个堆,并且运行时可能根据需要从底层OS获取“堆”的块

类似于“程序” - 可执行文件的各个部分可能散布着数据,或者地址空间中没有任何内容的区域。

答案 1 :(得分:3)

为此,

装配完全没用。如果系统的标准库实现公开了一个存储堆顶部地址的变量,那么您可以在不使用asm的情况下轻松访问它。否则,您可能能够访问和处理特定于操作系统的流程数据,例如(在Linux上)/proc/self/smaps,以确定程序的地址布局。但无论如何, asm不会帮助你

答案 2 :(得分:2)

如果您的标准库是glibc(可能),那么您可以#include <malloc.h>并致电malloc_stats();将堆报告打印到stderr