【问题标题】:Why the size of pointer to array is always 8 in C? [duplicate]为什么在 C 中指向数组的指针的大小总是 8? [复制]
【发布时间】:2015-01-16 14:24:23
【问题描述】:

以下是比较数组本身大小和指向数组的指针大小的简单代码。

#include <stdio.h>    
int main(){   
        int kkarray[100]= {1,0,};
        int (*kkpointer) = kkarray;

        printf("size of array using array itself : %ld \n" , sizeof(kkarray));        
        printf("size of array using pointer to array : %ld \n" , sizeof(kkpointer));   
}

但结果是,

400
8

我可以理解第一个值是 400,但第二个值,我认为它也应该是 400,因为当我分配了一个指向数组的指针 kkpointer 时,它有点像数组的名称,即 const地址值。例如,我可以使用 kkpointer[0] 获取数组的第一个值。 我想知道为什么我得到“8”而不是 400。 我不认为“8”是地址本身的大小。 请告诉我。谢谢

【问题讨论】:

  • sizeof 不是函数 - 它在编译时进行评估。它给你指针本身的大小 - 它不关心它指向什么。
  • @JonathonReinhart 幸运的是它并不关心指针,否则它将毫无用处。
  • @JonathonReinhart:您对第一部分的看法是正确的,它不是一个函数(无论如何它不可能是并且做它所做的事情)。但它是在编译时评估的。除非不是,这仅发生在 VLA(类型或变量)中。
  • @Deduplicator gahh 我知道。想一件事,然后输入另一件事!感谢您指出!

标签: c arrays pointers


【解决方案1】:

任何指针的大小始终为8在您的平台上,因此它取决于平台。

sizeof 运算符不关心指针指向的位置,它给出指针的大小,在第一种情况下它只给出数组的大小,这不一样。

这是引自 § 6.5.3.4¶ 2 N1570 草案

sizeof 运算符产生其操作数的大小(以字节为单位),可能是 表达式或类型的括号名称。 大小由类型决定 操作数。结果是一个整数。如果操作数的类型是变长数组 类型,计算操作数;否则,不计算操作数,结果为 整数常量

§ 6.5.3.4¶ 4

当 sizeof 应用于类型为 char、unsigned char 或 带符号的字符,(或其限定版本)结果为 1。当应用于 具有数组类型的操作数,结果是数组中的总字节数.103) 当 应用于具有结构或联合类型的操作数,结果是总数 此类对象中的字节数,包括内部和尾随填充

如您所见,当应用于数组时,它给出了总字节数。但是如果你传递一个指针,那么结果将是它的类型的大小。

【讨论】:

  • it is 4 in 32bit systems. ???!!
  • @al-Acme 为什么让你感到惊讶?
  • 在 32 位系统中不必是 4。基本上,指针的大小就是实现所说的任何内容。
  • @juanchopanza 我刚刚想起了x32 linux。
  • IIRC,x32 在 x86-64 上以长模式使用 32 位指针。
猜你喜欢
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 2018-02-20
  • 2012-08-13
  • 2017-06-19
  • 2014-07-22
  • 2017-06-01
  • 1970-01-01
相关资源
最近更新 更多