4
printf("address of literal: %p \n", "abc");
char alpha[] = "abcdef";
printf("address of alpha: %p \n", alpha);

上面,literal是存储在静态内存中,alpha是存储在动态内存中。我在一本书中读到,一些编译器使用不同的位数显示这两个地址(我只尝试在 Linux 上使用 gcc,它确实显示了不同的位数)。它取决于编译器,还是操作系统和硬件?

4

2 回答 2

3

我只尝试在 Linux 上使用 gcc,它确实显示了不同的位数

这并不是说它“使用不同数量的比特”。据我所知,Linux——至少在运行我所知道的主要平台(例如 x86、x64、ARM32)时——没有“近”和“远”指针。例如,在 x86 上,每个指针都是 32 位宽,而在 x64 上,每个指针都是 64 位宽。

就是这样……</p>

  • 编译器可能会alpha在堆栈上分配数组(允许这样做,因为它具有自动存储持续时间。它很可能存储在“动态内存”中,这将是愚蠢的,因为这将涉及多余的动态分配,即你可以用记忆做的最慢的事情之一。)
  • 同时,具有存储期限的文字本身static存储在其他地方(通常在可执行文件的数据段中);
  • 最重要的是,操作系统的内存管理器恰好将这两个东西(堆栈和可执行映像)放在很远的地方,因此其中一个的地址以很多零开头,而另一个中的地址则没有有那么多前导零。
  • 此外,您的 libc 实现中的默认行为%p恰好不打印前导零。
于 2015-08-09T13:00:58.810 回答
1

alpha存储在例如堆栈或另一个动态内存段中。literal存储在代码段内。这些是不同的地址范围。

地址取决于平台。在大多数情况下,指针大小为 4 字节长,但不同段的地址在不同的范围内。

地址取决于平台。

链接器负责地址分配。您可能希望启用一个选项以让链接器生成地址映射文件。

动态部分也称为数据段。静态部分是代码段。您会发现很多文献为您的平台搜索该术语(例如搜索“x86 内存分段”)。

于 2015-08-09T12:44:57.140 回答