c - 内存:在图表的顶部或底部的高地址?

标签 c memory memory-address

<分区>

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

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

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

最佳答案

我认为要真正理解这一点,您需要具备一些操作系统和汇编编程方面的知识。为了避免解释每个操作系统上的每个体系结构如何工作,我将在下面的解释中仅选择几个。假设我们在具有 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

关于c - 内存:在图表的顶部或底部的高地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51692291/

相关文章:

c - 当使用带有头文件的 if 语句时,我没有得到应该得到的输出。 [C 编程]

c - 如何在整数指针数组中分配内存?

iphone - 如果它们导致应用程序崩溃,如何查找内存泄漏?

c# - 我如何更改此代码,以便它改为写入字符串?

c++ - 在 C++ 中获取总内存和可用内存

c - 不能获取位域的地址

C:以起点读取文件

c - 在 Windows 上使用 asprintf()

c++ - 为什么这个volatile变量的地址一直是1?

C语言: How exactly is the size of an array calculated in C