C指针的大小取决于?

时间:2012-06-14 18:39:08

标签: c computer-science

C指针的大小取决于什么?它是数据总线的宽度,地址总线的宽度还是CPU的字大小?

我认为它应该取决于地址总线的宽度,因为指针必须解决许多位置。我是对的吗?

(我正在寻找依赖的原因,如果有的话)

5 个答案:

答案 0 :(得分:9)

指针的大小取决于您的编译器实现。在实践中,它几乎总是您正在构建的架构的原生单词大小。

值得注意的是,C语言标准允许指向不同类型的指针可能具有不同的大小,更好地支持具有不同大小的程序和数据内存的哈佛架构等。

答案 1 :(得分:6)

这取决于所讨论的CPU架构。您可以编写可移植代码,使用intptr_t(仅限C99)来考虑这一点。

答案 2 :(得分:2)

循环定义的排序,但它取决于实现用于标识对象所在位置的地址空间的大小。这反过来可能取决于硬件,操作系统或C实现者的心血来潮。

因此,如果实现希望存储65535个潜在位置来存储char,那么它将使用(至少)16位指针用于char*。对于40亿左右(或者可能是其中一半,某些实现没有或不能使用指针的最高位),32位。比你有更多的RAM,64位。

实际上,决策通常受到实现期望程序运行的操作系统的限制。如果操作系统的内存分配函数返回64位地址,那么实现使用较小的指针大小相当不方便,尽管在特定情况下可能存在黑客攻击。

如果实现将在没有OS的情况下运行,那么它将使用适合其运行的硬件的内存映射大小的大小。如果它与操作系统一起运行,则操作系统可能必然使用适合硬件的大小。我说不一定,因为现代64位操作系统习惯支持32位进程,因此在64位机器上运行的为32位环境编译的程序将使用32位指针。适合硬件的指针大小可能与同一硬件上的字大小相同或不同 - 通常是。

最后,由于某些类型大于1个字节,原则上可以通过对较大类型使用较小的指针来获得,并且标准允许这样做。想象一下具有8位字节,16位整数和128k可寻址存储器的机器,int个对象具有2字节对齐。那么char*需要至少17位(这将占用3个字节的存储空间),而原则上int*只需要16位(2个字节的存储空间),因为最少任何int的地址的有效位总是0,因此不需要严格存储。如果实现可以安排始终正确使用地址,那么允许它sizeof(int*) < sizeof(char*)。在实践中,大约没有人这样做过。

答案 3 :(得分:1)

指针的大小取决于程序编译的CPU架构。

答案 4 :(得分:-2)

所有指针占用内存中相同的空间量,而指针内存中的大小取决于编译代码的CPU架构。