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