这个大小的诀窍是做什么的?

时间:2012-07-27 21:20:06

标签: c sizeof

我看了C代码已经有一段时间了,但我正在努力确保我理解这里发生了什么。有人宣称这个(代码中有更多成员):

int trysizes[] = { 64, 64, 128, 64, };

然后他们将此作为for循环的一部分使用:

sizeof(trysizes)/sizeof*(trysizes)

我认为第一部分是数组中的字节数,第二部分必须是每个数组成员的大小,为我们提供数组中的项数。这是计算数组长度的标准方法吗?实际做的第二个尺寸是什么?

3 个答案:

答案 0 :(得分:15)

是的,在修复了令人困惑的语法之后,这就变成了

sizeof(trysizes)/sizeof(*trysizes)

甚至更好

sizeof(trysizes)/sizeof(trysizes[0])

这是计算数组元素数量的首选方法。第二个sizeof确实计算了数组元素0的大小。

请注意,这仅在trysizes实际上是数组时有效,而不是指向一个数组的指针。

答案 1 :(得分:1)

你明白了。分母中的第二个sizeof取消引用数组的第一个元素,产生元素0的大小。 sizeof知道数组变量的总缓冲区大小 - 分子 - 因此这个习惯用法将产生数组中元素的数量。

根据我的经验,这是这种特殊习语的罕见表达,通常我已经看过,我使用

sizeof(var)/sizeof(var[0]);

这更清楚地将变量标识为数组而不是指针。

这是一个非常常见的技巧,但请注意,只有将变量声明为数组时,它才有效。这不适用于已作为函数参数转换为指针的数组。

答案 2 :(得分:1)

关键是,当使用sizeof时,虽然我们主要使用int a; sizeof(a);,但我们也可以省略括号,如下所示:int a; sizeof a;
所以在这种情况下,sizeof*(trysizes) == sizeof *trysizes == sizeof(*trysizes)