gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:32:15 27 4
gpt4 key购买 nike

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

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

最佳答案

I only tried using gcc on Linux, and it does show different number of bits

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

只是……

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

关于c - C 中的静态和动态内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31904168/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com