【问题标题】:Heap address decrease, and increase堆地址减少,增加
【发布时间】:2020-09-19 14:10:49
【问题描述】:

为什么堆在一定级别后增加然后减少,然后再增加? In linux os

我在研究os,内存结构的时候,发现了一些奇怪的地址增加...

程序很简单,只是递归调用堆栈和堆增加。

void recursive(int count){
long stack;
long* heap;

heap = (long*)malloc(sizeof(long)*100000000000);


        heap = (long*)malloc(sizeof(long)*100000);
        if((long*)heap >= (long*)&stack){
            printf("heap is contact with stack\n");
            exit(1);
        }


printf("%diteration \\ heap : %p || stack : %p\n",count, heap, &stack);
recursive(++count);

}

【问题讨论】:

  • 可能是使用较大的块(在一个方向)来服务较小的块(在另一个方向)。请直接在问题中以文本形式提供更多该输出。确保至少显示三个突然的变化。
  • 内存地址,由malloc和好友给定,不必线性增加。
  • 我不确定你用这段代码证明什么?堆可能会或可能不会分配在比堆栈更高的地址......除非 malloc 给你一个空指针作为回报......这就是它。所以呢?另外:ASLR.
  • heap&stack 之间比较的行为未定义,因为它们不指向相同的成员 数组。

标签: c linux heap-memory


【解决方案1】:

您的heap 指针未指向堆顶。它指向分配的内存块,它可以在任何地方。最接近您要查找的是中断指针,您可以通过调用sbrk(0) 找到它。请注意,在现代系统中,您不一定有一个连续的堆。这里有一个详细的解释: What does the brk() system call do?

【讨论】:

    猜你喜欢
    • 2013-08-11
    • 1970-01-01
    • 2011-11-27
    • 2017-06-03
    • 2021-11-21
    • 1970-01-01
    • 2013-07-26
    • 2019-10-29
    • 1970-01-01
    相关资源
    最近更新 更多