C中的静态和动态内存地址

时间:2015-08-09 12:21:39

标签: c dynamic-memory-allocation static-memory-allocation

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

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

2 个答案:

答案 0 :(得分:3)

  

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

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

只是......

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

答案 1 :(得分:1)

例如,存储

alpha在堆栈或其他动态内存段中。 literal存储在代码段内。这些是不同的地址范围。

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

地址取决于平台。

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

动态部分也称为数据段。静态部分是代码段。你会发现很多文献都在为你的平台搜索这个术语(例如搜索" x86内存分段")。