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
存储 -8 个字节xx
。我在这里掩盖了有关图片的一些细节,但我要说明的一点是,内存从高地址到低地址被添加到堆栈中。所以当高地址在下,低地址在上的时候,意思是一样的,但是这取决于作者的选择和他们自己的记忆心智模型。
参考:
https://eli.thegreenplace.net/2011/09/06/stack-frame-layout-on-x86-64
推荐阅读
- asp.net-core - 无法在 Razor Pages 代码隐藏类中使用注入类
- security - 将 IP 地址列入白名单时,我可以信任 X-Forwarded-For 标头值吗?
- javascript - 在令牌更新时更新横向组件?
- date - Windows 10 工具栏。不仅仅是显示文件夹内容
- c# - 在 C# 中访问 SRSS 数据
- python - 在 df 中使用基于列 vale 的字典中的值创建新列
- javascript - 如何使用 jquery 选择框更改计算总运费?
- swift - 标题中的不同标签取决于集合视图中的部分
- java - 部署到 Google App Engine 时 Spring Boot CORS 配置不起作用
- java - 在 springboot 中 Keycloak-admin-client 总是返回 null