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

为什么sizeof(argv) sizeof(argv [0])给出了C中数组的大小?,第1张

概述如果我在main中有一个数组作为参数 int main(int argc, char* argv[]) 为什么会 sizeof(argv)/sizeof(argv[0]) 总能可靠地给我阵列的长度? 它没有. 在写这个答案时,我可能会有点失望;对于一个相当简单的问题,语言 – 律师方法太过分了.我将添加这个快速摘要,足以回答这个问题.答案的迂腐和过于冗长的版本低于水平线. 鉴于: int main 如果我在main中有一个数组作为参数

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

为什么会

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

总能可靠地给我阵列的长度?

解决方法 它没有.

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

鉴于:

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标准对指针表示的要求是:

A pointer to voID shall have the same representation and alignment
requirements as a pointer to a character type. Similarly,pointers
to qualifIEd or unqualifIEd versions of compatible types shall have
the same representation and alignment requirements. All pointers to
structure types shall have the same representation and alignment
requirements as each other. All pointers to union types shall have the
same representation and alignment requirements as each other. Pointers
to other types need not have the same representation or alignment
requirements.

参考:N1570,6.2.5p28.

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

An object of type cv voID* shall have the same representation and alignment
requirements as cv char*.

我没有找到我从C标准中引用的其余部分的相应文本.

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

总结

以上是内存溢出为你收集整理的为什么sizeof(argv)/ sizeof(argv [0])给出了C中数组的大小?全部内容,希望文章能够帮你解决为什么sizeof(argv)/ sizeof(argv [0])给出了C中数组的大小?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1223307.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存