指针占用了多少字节?

时间:2013-12-24 16:01:20

标签: c pointers

我对指针和它们占用的字节有点困惑。在我的教科书中,它首先说明16位系统上的指针占用2个字节,32位系统占用4个字节,64位系统占用8个字节,依此类推。然后是10行,它表示指针占用了许多字节,这是保存地址所需的。以下是我的问题:

  1. 这是否意味着如果我们可以说64位系统,地址最多需要8个字节?
  2. 如果我们在16位系统上,指针占用2个字节,并且地址需要更多的2个字节,那么会发生什么?

5 个答案:

答案 0 :(得分:10)

简短的回答是,这取决于。当我们说系统是32位时,这可能意味着本机整数是32位宽,本机地址(即指针大小)是32位宽,或两者都是。

最重要的是,并非每个架构都使用flat memory model(例如,请参阅x86 memory segmentation)。这进一步使问题复杂化。

最好将指针的大小视为不透明。

C99以intptr_t and uintptr_t类型的形式提供工具,这些工具是保证宽度足以容纳指针的整数。

答案 1 :(得分:9)

没有固定的答案;它完全取决于体系结构,编译器实现,甚至指针本身的类型。指向不同类型的指针不能保证具有相同的大小和/或表示。

例如,假设一个字寻址架构,其中最小的可寻址存储单元是16位宽(或更宽)。每个单词可以包含多个char值;所有其他类型都会占用一个或多个字。在这样的体系结构中,与其他指针类型相比,char *void *需要一些额外的位来偏移到字中。

另请注意,指针类型可能比实际存储地址所需的位数更宽。最初的Macintosh是在Motorola 68000 CPU上运行的,它具有32位字大小,但在地址总线上只有24位。指针类型为32位宽,高8位未使用。积极进取的MacOS程序员利用这一点将一些数据存储到指针类型的最高字节,充分利用了宝贵的128 KB RAM。当然,摩托罗拉最终发布了一个具有32个地址线(68020)的CPU,这意味着所有代码都必须重写。

在现代商品桌面和服务器硬件上(读取:x86),假设所有指针类型与本机字大小(32位或64位)相同,并且所有指针类型都具有相当大的安全性是相当安全的相同的大小和表示。请注意,这不是 是真的。

答案 2 :(得分:4)

指针的大小主要取决于实现它的系统的体系结构。例如,32位指针的大小在64位机器中是4字节(32位)和8字节(64位)。机器中的位类型只是内存地址,它可以容纳。 32位计算机可以容纳2^32,64位计算机可以容纳2^64个地址空间。因此,指针(指向内存位置的变量)应该能够指向机器所拥有的任何内存地址(2^32 for 32 bit and 2^64 for 64 bit)。

由于这个原因,我们看到指针的大小在32位机器中是4个字节,在64位机器中是8个字节。

Is the sizeof(some pointer) always equal to four?

中回答

答案 3 :(得分:3)

指针用于存储变量的地址。内存地址/位置的宽度取决于计算机体系结构。如果计算机体系结构是16位,则意味着它可以有2 ^ 16个内存位置。因此,对于能够在该计算机中存储任何存储器位置的指针,它应该是16位宽,即2个字节(8位= 1个字节)。类似地,对于32位和64位架构,我们需要分别具有4字节(32位宽)和8字节(64位宽)的指针。
此外,如果系统是16位,那么它的地址位置不能超过16位。

答案 4 :(得分:1)

这将告诉您在系统上表示指针所需的字节数。

    #include <stdio.h>
    int main() {
        printf("%ld bytes per pointer\n", sizeof(void *));
    }

这是一个编译器标志,您可以使用该主题进行播放:

$ gcc -m32 -o prog32 prog.c
$ gcc -m64 -o prog64 prog.c

第一行为32位环境生成二进制文件,为您提供4个字节的指针。第二行为64位环境生成二进制文件,为您提供8个字节的指针。您可以通过运行上述程序来确认这一点。

假设您使用的是GCC的64位系统。希望这能澄清一些事情。

相关问题