<分区>
我正在学习内存和 C 语言。为什么有些图中高地址位于图的顶部,而在其他图中高地址位于图的底部?
最佳答案
我认为要真正理解这一点,您需要具备一些操作系统和汇编编程方面的知识。为了避免解释每个操作系统上的每个体系结构如何工作,我将在下面的解释中仅选择几个。假设我们在具有 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
从 xx
开始存储 -8 个字节。我在这里掩饰了一些关于图片的细节,但我想说明的是,内存是从高地址到低地址添加到堆栈中的。所以画图时高地址在下,低地址在上,意思是一样的,但要看作者的选择和自己的内存心智模型。
引用资料:
https://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64
关于c - 内存:在图表的顶部或底部的高地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51692291/