c - 堆栈:低内存与高内存地址的实际位置?

标签 c stack

我一直在阅读一些教程中有关堆栈和内存地址位置的内容,想知道为什么它们对低内存位置和高内存位置的引用不同?

这令人困惑。

例如

低内存地址在顶部,高内存地址在底部 enter image description here

低内存地址在底部,高内存地址在顶部 enter image description here

当我用一个简单的 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/

相关文章:

gdb - 如何从核心转储(没有 GDB)中读取帧?

Javascript:如何使用单个数组实现三个堆栈?

c++ - 正整数 N 作为使用堆栈的正整数之和

c - eclipse 指向错误的头文件

c - Vala:使用库不起作用:找不到 taglib、tag_c.h

c - 不承认换行符、EOF 和 feof()

java - 主类的 Java 表达式错误中的 LISP 评估

c - 在平面二进制文件中包含 char 数组的内容

c - 使用register_chrdev动态分配主编号时,保留256个次编号有什么意义吗?

c - gdb 调试 8 字节间隙有什么用?