堆栈和堆上的内存位置模式

时间:2012-03-25 04:27:20

标签: c pointers

我只是好奇堆栈上的变量(指针)的地址长度与堆之间是否存在任何关联。在很多情况下,我发现与堆相比,堆栈变量通常更长。例如,考虑以下简单测试:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int i = 0;
    int *j = malloc(sizeof(int)); *j = 0;

    printf("&i = %p\n j = %p\n", &i, j);

    free(j);
    return 0;
}

输出:

&i = 0x7fffe9c7fa5c
 j = 0x100e010

这些结果是在linux中使用gcc获得的;这可能是OS /编译器依赖吗?

2 个答案:

答案 0 :(得分:2)

结果取决于程序地址空间中堆(s)和堆栈的位置。这些由链接器和处理器架构决定。

由于ASLR,现代系统上的确切数字应该是随机的。

然而,堆通常会向上增长,并向下堆积。此外,出于性能和内存管理的原因,堆和堆栈总是从page边界开始。

答案 1 :(得分:2)

我相信这是因为内存的物理部分我们认为它们被称为堆栈和堆。因为它们从相对的两端开始并向中间生长,所以一个较低而另一个较高是有意义的。如果你在堆栈上分配2个连续的变量并且在堆上分配2个连续变量,那将会很有趣。这有助于了解堆栈和堆的增长方式。实际上我觉得为了这个工作你需要创建一个新的堆栈框架(一个新方法)并在那里分配第二个变量,否则你将保持在同一个堆栈框架中。