为什么sizeof(argv)/ sizeof(argv [0])在C ++中给出了数组的大小?

时间:2013-05-15 00:16:06

标签: c++ arrays pointers sizeof

如果我在主

中有一个数组作为参数
int main(int argc, char* argv[])

为什么

sizeof(argv)/sizeof(argv[0])

总能可靠地给我数组的长度吗?

1 个答案:

答案 0 :(得分:21)

没有。

写这个答案时,我可能有点沮丧;对于一个相当简单的问题,语言 - 律师方法太过分了。我将添加这个快速摘要,足以回答这个问题。答案的迂腐和过于冗长的版本低于水平线。

假设:

int main(int argc, char* argv[])

argv根本不是数组;它是一个指针。 (C和C ++不允许数组类型的参数;看起来像数组参数的东西实际上是指针参数。)argv确实指向(在运行时)数组的第一个元素,但是没有声明中的信息有关该数组的大小。这就是我们需要argc参数来提供该信息的原因。

因此sizeof(argv)/sizeof(argv[0]) 不会为您提供数组中元素的数量;它只是将指针的大小除以指针的大小,可能给你1。 (为什么只有“可能”?这是下面过于迂腐的答案的一部分。)

现在,如果您明确定义某个数组对象:

int an_array[42];

可以使用该习惯用法来计算数组中元素的数量:

sizeof an_array / sizeof an_array[0]

这会产生42,即数组中元素的数量。它的工作方式(我认为)相当简单:它是整个数组的字节大小除以其中一个元素的字节大小。

但是对于一个实际的数组它只能 ,而不是像argv那样看起来就像一个数组但实际上是一个指针。

数组和指针之间的关系可能令人困惑。 comp.lang.c FAQ的第6节解释得非常好,大部分或全部都适用于C和C ++。

现在是冗长的迂腐解释,有太多的离题:


argv是一个指针,特别是指向char指针的指针。作为参数声明(在该上下文中仅 ),char *argv[]相当于char **argv

sizeof (argv)char**指针中的字节数。

sizeof (argv[0])char*指针中的字节数。

sizeof (argv) / sizeof (argv[0])很可能是1(假设char*char**具有相同的大小,这在大多数实现中都是这样。)

现在对于被定义为数组对象的东西:

some_type an_array[COUNT];

表达式确实有效;这样:

sizeof an_array / sizeof an_array[0]

会为您提供an_array中的元素数量,即COUNT。我认为,原因应该是相当明显的。数组中的字节数是数组的一个元素中的字节数乘以元素数。所以:

sizeof an_array == sizeof an_array[0] * COUNT

并重新安排条款:

sizeof an_array / sizeof an_array[0] == COUNT

顺便说一句,sizeof an_array[0]也可以写成sizeof *an_array,因为索引运算符是用C语言定义的。

(注意sizeof运算符在其参数周围不需要括号,如果该参数是表达式(如对象名)。sizeof的操作数是表达式或带括号的类型但是,如果您希望始终使用括号sizeof,则可以这样做。)

这是计算数组中元素数量的常用习惯用法 - 但只有当您拥有数组本身的名称而不是指向其第一个元素的指针时,它才有效。

[以下内容适用于C.我相信它也适用于C ++(我最初没有注意到问题是标记为C ++,而不是C)。]

在回答评论中提出的问题时,不,char*char**不需要具有相同的尺寸。 C标准对指针表示的要求是:

  

指向 void 的指针应具有相同的表示和对齐方式   要求作为指向字符类型的指针。同样,指针   合格或不合格版本的兼容类型应具备   相同的表示和对齐要求。所有指针   结构类型应具有相同的表示和对齐方式   彼此的要求。所有指向union类型的指针都应该有   相同的表示和对齐要求。指针   其他类型不需要具有相同的表示或对齐   要求。

参考:N1570,6.2.5p28。

C ++标准至少有一部分内容; N3485草案第3.9.2节[basic.compound]说:

  

cv void*类型的对象应具有相同的表示和对齐方式   要求为 cv char*

我没有找到我从C标准中引用的其余内容的相应文本。

在字寻址机器上,char*指针可能需要更多信息来指定该字内的字和字节,而不是char**指针所需的字,只需要指定一个对齐的词。