指针的大小在C中是否有所不同?

时间:2010-08-19 08:44:58

标签: c pointers

  

可能重复:
  Can the Size of Pointers Vary Depending on what’s Pointed To?
  Are there are any platforms where pointers to different types have different sizes?

指向浮点数的指针大小是否可能与指向int的指针不同?尝试过之后,我得到了各种指针的相同结果。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("sizeof(int*): %i\n", sizeof(int*));
    printf("sizeof(float*): %i\n", sizeof(float*));
    printf("sizeof(void*): %i\n", sizeof(void*));
    return 0;
}

这里有哪些输出(OSX 10.6 64位)

sizeof(int*): 8
sizeof(float*): 8
sizeof(void*): 8

我可以假设不同类型的指针具有相同的大小(当然在一个拱门上)吗?

11 个答案:

答案 0 :(得分:20)

在同一个拱门上,指针的大小并不总是一样。

您可以阅读更多关于“near”,“far”和“huge”指针的概念,就像指针大小不同的情况一样...

http://en.wikipedia.org/wiki/Intel_Memory_Model#Pointer_sizes

答案 1 :(得分:11)

在旧的日子里,使用例如在DOS平台上的Borland C编译器,总共有(我认为)5种内存模型,甚至可以在某种程度上混合使用。从本质上讲,您可以选择指向数据的小型或大型指针,以及代码的小型或大型指针,以及代码和数据具有共同地址空间(如果我没记错)64K的“微小”模型。

可以在程序中指定“巨大”指针,否则这些指针是在“微小”模型中构建的。因此,在最坏的情况下,可以在同一程序中使用不同大小的指针指向同一数据类型

我认为该标准甚至不禁止这一点,所以从理论上讲,一个不起眼的C编译器甚至可以做到这一点。但毫无疑问,专家们将能够证实或纠正这一点。

答案 2 :(得分:8)

指向数据的指针必须始终与void*兼容,因此通常它们现在会被实现为相同宽度的类型。

对于函数指针,此语句不正确,它们可能具有不同的宽度。因此,在C99中,void*的函数指针是未定义的行为。

答案 3 :(得分:5)

据我所知,C标准中没有任何内容可以保证指向不同类型的指针必须具有相同的大小,因此理论上同一平台上的int *和float *可以是不同的大小而不会破坏任何规则。

要求char *和void *具有相同的表示和对齐要求,并且对于指针类型的不同子集存在各种其他类似的要求,但没有任何内容包含所有内容。

在实践中,除非你进入一些相当模糊的地方,否则你不太可能遇到任何使用不同大小指针的实现。

答案 4 :(得分:3)

是的,指针的大小取决于平台。更具体地说,指针的大小取决于目标处理器体系结构和您编译的“bit-ness”。

根据经验,在64位机器上,指针通常是64位,在32位机器上通常是32位。但也有例外。

由于指针只是一个内存地址,因此无论指向的内存包含多少,它的大小始终相同。所以指向float,char或int的指针都是相同的大小。

答案 5 :(得分:3)

是。这种情况并不常见,但这肯定会发生在不可字节寻址的系统上。例如。 16位系统,64 Kword = 128KB内存。在这样的系统上,你仍然可以有16位的int指针。但是指向8位字符的char指针需要一个额外的位来指示字内的高字节/低字节,因此你有17/32位字符指针。

这可能听起来很奇特,但许多DSP花费99.x%的时间执行专门的数字代码。如果它只需处理16位数据,那么声音DSP可以更简单一些,而编译器会模拟偶尔的8位数学运算。

答案 6 :(得分:3)

我打算写回复说C99有各种指针转换要求,或多或少地确保指向数据的指针必须大小相同。然而,在仔细阅读它们时,我意识到C99是专门设计的,允许指针针对不同类型具有不同的大小。

例如,在整数为4个字节并且必须对齐4个字节的体系结构中,int指针可能比char或void指针小两位。如果演员实际上在两个方向都进行了转换,你对C99没问题。它有用地说,未正确定义了一个指向错误对齐的int指针的char指针的结果。

请参阅C99 standard。第6.3.2.3节

答案 7 :(得分:1)

  

我可以假设不同类型的指针具有相同的大小(当然在一个拱门上)吗?

对于具有平坦内存模型的平台(==所有流行/现代平台),指针大小将相同。

对于具有分段内存模型的平台,为了提高效率,通常会有不同大小的特定于平台的指针类型。 (例如,DOS中的far指针,因为8086 CPU使用了分段内存模型。)但这是特定于平台的非标准。

您可能应该记住,在C ++中,普通指针的大小可能与指向虚拟方法的指针大小不同。指向虚方法的指针必须保留额外的信息才能使多态无法正常工作。这可能只是我所知道的例外,这仍然是相关的(因为我怀疑分段内存模型会让它回来)。

答案 8 :(得分:0)

指针是一个内存地址 - 因此在特定的机器上应该是相同的。 32位机器=&gt; 4Bytes,64 bit =&gt; 8字节。

因此,无论指针所指向的东西的数据类型如何,特定机器上指针的大小都是相同的(因为存储内存地址所需的空间将是相同的。)

假设:我在谈论数据值的近指针,你在问题中声明的那种。

答案 9 :(得分:0)

指针在同一个拱门上的大小始终相同,无论它指向哪种数据类型。 否则,在不同指针类型之间进行投射之类的东西是无用的,并且会破坏很多东西。

许多常见的编码技术依赖于在例如void指针(或char)与各种结构之间进行转换,具体取决于大小。

即使是标准的printf(),也必须能够指向各种数据。如果指针大小不同,实现printf可能会非常混乱。

答案 10 :(得分:0)

有些平台的函数指针与其他指针的大小不同。

我从未见过比这更多的变异。所有其他指针必须至多为sizeof(void *),因为标准要求它们可以转换为void *而不会丢失信息。