繁体   English   中英

需要说明此C程序中的内存地址如何工作

[英]need explanation of how memory address work in this C program

我有一个非常简单的C程序,出于自身的好奇心,我正在调查哪个内存地址用于分配局部变量。 我的程序是:

#include <stdio.h>

int main()
{
  char buffer_1[8], buffer_2[8], buffer_3[8];
  printf("address of buffer_1 %p\n", buffer_1);
  printf("address of buffer_2 %p\n", buffer_2);
  printf("address of buffer_3 %p\n", buffer_3);
  return 0;
}

输出如下:

address of buffer_1 0x7fff5fbfec30
address of buffer_2 0x7fff5fbfec20
address of buffer_3 0x7fff5fbfec10

我的问题是:为什么地址似乎越来越小? 这有逻辑吗? 谢谢。

允许编译器对您的自动变量执行任何所需的操作。 在这种情况下,看起来就像是将它们连续放置在堆栈上。 在当今使用的大多数流行系统上,堆栈向下增长。

大多数编译器在函数开始的第一步就为本地变量分配了堆栈内存。 内存被分配为单个连续块。 在这种情况下,显然,编译器可以自由地使用任何内存布局作为该块内的局部变量。 如果可以将它们放在那里,以便地址按声明的顺序增加。 或减少。 或随机安排。 这是一个实现细节。 而且背后没有太多逻辑。

在您的情况下,编译器很可能试图“假装”阵列的内存是顺序且独立地在堆栈中分配的(即使不是这种情况)。 如果在您的平台上堆栈向下增长(就像在许多平台上一样),则可以预期以后声明的对象将具有较小的地址。

但是同样,函数不会单独分配本地对象。 最重要的是,该语言无法保证本地对象地址之间的任何关系。 因此,没有真正的理由更喜欢一种排序方式。

C程序的输出与平台有关,与编译器有关。 不能仅有一个完美的答案,因为地址的安排根据以下因素而有所不同:系统是小字节序还是大字节序。 您正在编译哪种操作系统。 您要编译哪种内存体系结构。 您使用的是哪种类型的编译器(并且编译器也可能有错误),无论您使用的是64位还是32位平台。 还有更多。

但最重要的是处理器架构的类型。 :)

以下是每个处理器的堆栈增长策略列表:

x86,PDP11    Downwards
System z     In a linked list fashion, downwards, mostly.
ARM          Select-able and can grow in either up or downward.
Mostek6502   Downwards (but only 256 bytes).
SPARC        In a circular fashion with a sliding window, a limited depth stack. 
RCA1802A     Subject to SCRT(Standard Call and Return Technique) implementation.

但是,通常,您的编译器在编译时应将这些地址映射到生成的二进制文件中。 然后,在运行时,二进制文件可能会占用(或伪装成会占用)一组连续的内存地址。 在您的情况下,由C源打印的地址表明堆栈正在向下增长。

基本上,编译器负责为所有变量分配内存。 数组获取堆栈上的地址。 但这与您获得的输出无关。 基本上,问题是编译器当时发现连续空间(或内存块)为空,因此将其分配给程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM