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

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

#include  #include  int main(void) { int i = 0; int *j = malloc(sizeof(int)); *j = 0; printf("&i = %p\nj = %p\n", &i, j); free(j); return 0; } 

输出:

 &i = 0x7fffe9c7fa5c j = 0x100e010 

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

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

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

然而,堆通常会向上增长,并向下堆积。 此外,出于性能和内存管理的原因,堆和堆栈将始终在页面边界上开始。

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