printf("address of literal: %p \n", "abc");
char alpha[] = "abcdef";
printf("address of alpha: %p \n", alpha);
上面,literal
存储在静态存储器中,alpha
存储在动态存储器中。我在一本书中读到,有些编译器使用不同的位数显示这两个地址(我只在Linux上尝试使用gcc,它确实显示了不同的位数)。它取决于编译器,操作系统和硬件吗?
答案 0 :(得分:3)
我只尝试在Linux上使用gcc,它确实显示不同的位数
并非它“使用不同数量的位”。据我所知,Linux - 至少在运行我所知的主要平台(例如x86,x64,ARM32)时 - 没有“近”和“远”指针。例如,在x86上,每个指针都是32位宽,而在x64上,每个指针都是64位宽。
只是......
alpha
数组(由于它具有自动存储持续时间,因此允许这样做。很可能不存储在“动态内存”中,这将是愚蠢的,因为这将涉及多余的动态分配,这是你可以用记忆做的最慢的事情之一。)static
存储持续时间的文字本身存储在别处(通常在可执行文件的数据段中); %p
的默认行为恰好不会打印前导零。答案 1 :(得分:1)
alpha
在堆栈或其他动态内存段中。 literal
存储在代码段内。这些是不同的地址范围。
地址取决于平台。在大多数情况下,指针大小为4个字节长,但不同段的地址位于不同的范围内。
地址取决于平台。
链接器负责地址分配。您可能希望启用一个选项,让链接器生成一个地址映射文件。
动态部分也称为数据段。静态部分是代码段。你会发现很多文献都在为你的平台搜索这个术语(例如搜索" x86内存分段")。