我只是好奇堆栈上的变量(指针)的地址长度与堆之间是否存在任何关联。在很多情况下,我发现与堆相比,堆栈变量通常更长。例如,考虑以下简单测试:
#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 /编译器依赖吗?
答案 0 :(得分:2)
结果取决于程序地址空间中堆(s)和堆栈的位置。这些由链接器和处理器架构决定。
由于ASLR,现代系统上的确切数字应该是随机的。
然而,堆通常会向上增长,并向下堆积。此外,出于性能和内存管理的原因,堆和堆栈总是从page边界开始。
答案 1 :(得分:2)
我相信这是因为内存的物理部分我们认为它们被称为堆栈和堆。因为它们从相对的两端开始并向中间生长,所以一个较低而另一个较高是有意义的。如果你在堆栈上分配2个连续的变量并且在堆上分配2个连续变量,那将会很有趣。这有助于了解堆栈和堆的增长方式。实际上我觉得为了这个工作你需要创建一个新的堆栈框架(一个新方法)并在那里分配第二个变量,否则你将保持在同一个堆栈框架中。