堆如何引用存储在堆栈中?

时间:2015-12-01 18:38:00

标签: memory-management stack heap-memory ram

我正在阅读内存管理,并完全被以下事情搞糊涂了。请解释一下。我无法理清我的概念。

  1. 每个堆的根节点的引用都驻留在堆栈中。为什么有必要?
  2. 对象或引用类型还需要堆栈空间以及堆?
  3. 我知道这些问题是非常基本的,或者可能是错误的预测。但我完全糊涂了。

    请解释。

1 个答案:

答案 0 :(得分:1)

让我们看一下C语言表示的一个例子:

void foo(void)
{
    char *heap;

    heap = malloc(4096);

    memset(heap, 0xff, 4096);

    free(heap);
}

如果需要4096字节的堆内存,则应在堆中分配内存。此外,您需要保留内存的起始地址(指针)来操作之前分配的堆内存。所以你需要额外的指针变量heap,它保存一个指向堆内存的指针。 想象一下,heap不存在,你如何像下面那样操纵堆内存:

void bar(void)
{
    // allocated 4096 bytes heap memory.
    // but there is no pointer variable to keep its address
    malloc(4096);

    // how do you manipulate the memory?
    memset(???, 0xff, 4096);

    // how do you free the memory?
    free(???);
}