我一直在阅读一些教程中有关堆栈和内存地址位置的内容,想知道为什么它们对低内存位置和高内存位置的引用不同?
这令人困惑。
例如
当我用一个简单的 C
程序尝试时,Low Memory Address 似乎位于顶部。来自 bfbf7498 > bfbf749c > bfbf74a0 > bfbf74a4 > bfbf74a8 > bfbf74ac
user@linux:~$ cat > stack.c
#include <stdio.h>
int main()
{
int A = 3;
int B = 5;
int C = 8;
int D = 10;
int E = 11;
int F;
F = B + D;
printf("+-----------+-----+-----+-----+\n");
printf("| Address | Var | Dec | Hex |\n");
printf("|-----------+-----+-----+-----|\n");
printf("| %x | F | %d | %X |\n",&F,F,F);
printf("| %x | E | %d | %X |\n",&E,E,E);
printf("| %x | D | %d | %X |\n",&D,D,D);
printf("| %x | C | 0%d | %X |\n",&C,C,C);
printf("| %x | B | 0%d | %X |\n",&B,B,B);
printf("| %x | A | 0%d | %X |\n",&A,A,A);
printf("+-----------+-----+-----+-----+\n");
}
user@linux:~$
user@linux:~$ gcc -g stack.c -o stack ; ./stack
+-----------+-----+-----+-----+
| Address | Var | Dec | Hex |
|-----------+-----+-----+-----|
| bfbf7498 | F | 15 | F |
| bfbf749c | E | 11 | B |
| bfbf74a0 | D | 10 | A |
| bfbf74a4 | C | 08 | 8 |
| bfbf74a8 | B | 05 | 5 |
| bfbf74ac | A | 03 | 3 |
+-----------+-----+-----+-----+
user@linux:~$
最佳答案
您的问题不是很清楚。 Arjun 回答的是为什么 堆栈内存会向下增长(减少内存地址)而不是向上增长(增加内存地址),对此的简单回答是它是任意的。这真的无关紧要,但架构必须选择一个或另一个——通常有 cpu 指令操纵堆栈,它们期望特定的实现。
您可能会问的另一个问题与来自多个来源的视觉引用有关。在上面的示例中,您有一个图表在顶部显示低地址,而另一个图表在底部显示低地址。它们都显示堆栈从较大的地址向下增长到较小的地址。同样,这是任意的,作者需要选择一个或另一个,他们正在向您传达他们的选择。如果您想并排比较它们,您可能需要翻转一个,使它们具有相似的方向。
顺便说一句,您的示例代码显示堆栈确实从高地址开始并向下增长(“A”的内存地址首先分配并且具有比其他地址更高的内存地址)。
关于c - 堆栈:低内存与高内存地址的实际位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50421145/