首页 > 解决方案 > 内存:在图表的顶部或底部的高地址?

问题描述

我正在学习记忆和 C 语言。为什么在某些图表中,高地址位于图表顶部,而在其他图表中,高地址位于图表底部?

高位内存地址在底部 高位内存地址在底部

高位内存地址在顶部 高位内存地址在顶部

标签: cmemorymemory-address

解决方案


我认为要真正理解这一点,您需要具备一些操作系统和汇编编程知识。为了避免解释每个操作系统上的每个架构是如何工作的,我将在下面的解释中挑选一些。假设我们正在使用 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 处理器上如下所示:

在此处输入图像描述

请注意,在上面的卡通图中,我们堆栈上的每个变量是如何与下一个变量相隔 8 个字节存储的。还要注意定义变量的顺序。例如,yy存储 -8 个字节xx。我在这里掩盖了有关图片的一些细节,但我要说明的一点是,内存从高地址到低地址被添加到堆栈中。所以当高地址在下,低地址在上的时候,意思是一样的,但是这取决于作者的选择和他们自己的记忆心智模型。

参考:

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


推荐阅读