内存:在图的顶部或底部是高地址吗?

时间:2018-08-05 07:25:20

标签: c memory memory-address

我正在与C语言一起学习记忆。在某些图中,高位地址为何位于图的顶部,而在其他图中,高位地址为何位于图的底部?

底部的高内存地址 High memory address at the bottom

顶部的高内存地址 High memory address at the top

2 个答案:

答案 0 :(得分:0)

我认为要真正理解这一点,您需要具有一些操作系统和汇编程序设计知识。为了避免解释每个操作系统上的每种体系结构是如何工作的,我在下面的解释中仅介绍几个。假设我们在带有x86_64处理器(英特尔现代台式机处理器体系结构)的台式机上的Linux内核上运行C程序。

Linux内核将内存分为用户空间和内核空间。用户空间占用较高的内存空间,而内核空间占用较低的内存空间。因此,用C编写的用户空间程序将具有较高的内存地址,并在该空间中从较高地址分配到较低地址。由于我们在x86_64上运行程序,因此这意味着我们具有64位或8字节寻址。因此,每当您在堆栈上创建一个新变量时,它将占用8字节的内存。

假设我们在下面具有以下简单功能:

long utilfunc(long a, long b, long c)
{
    long xx = a + 2;
    long yy = b + 3;
    long zz = c + 4;
    long sum = xx + yy + zz;

    return xx * yy * zz + sum;
}

调用C函数时,会在x86_64处理器上的内存中创建一个堆栈框架,如下所示:

enter image description here

请注意,在漫画中,堆栈中每个变量的存储方式是距离下一个8个字节。还请注意定义变量的顺序。例如,yyxx开始存储-8个字节。我在这里掩盖了有关图片的一些细节,但是我想说明的一点是,内存是从高地址到低地址添加到堆栈中的。因此,当绘制图时在底部的高位地址和顶部的低位地址时,含义是相同的,但这取决于作者的选择和他们自己的记忆心理模型。

参考文献:

https://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64

答案 1 :(得分:-1)

人们把高内存地址放在最上面是因为他们错了。我还没有找到这样做的实际理由。人们应该将低内存地址放在顶部,因为这是我们在调试器中查看内存的方式,也是自然的读取方式(从上到下)。此外,随着堆栈的增长,在顶部视点的低地址中,很自然地会想到物理堆栈(如板块)自下而上递增。

与使用图表相比,您将更频繁地使用调试器。为什么不按照您在大部分时间使用它时看到的方式来学习它。