内存:在图中高地址在顶部还是底部?

Ste*_*jac 5 c memory memory-address

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

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

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

Rob*_*man 2

我认为要真正理解这一点,您需要具备一些操作系统和汇编编程的知识。为了避免解释每个操作系统上的每个体系结构如何工作,我将在下面的解释中仅选择一些体系结构。假设我们正在具有 x86_64 处理器(Intel 的现代桌面处理器架构)的桌面上的 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;
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

请注意上面的漫画中堆栈中的每个变量如何与下一个变量存储 8 个字节。另请注意变量定义的顺序。例如,yy存储了 中的 -8 个字节xx。我在这里掩盖了有关图片的一些细节,但我想要指出的一点是,内存是从高地址到低地址添加到堆栈中的。因此,当以高地址在下、低地址在上的方式绘制图表时,含义是相同的,但这取决于作者的选择和他们自己的记忆思维模型。

参考:

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