8

自从我查看 C 代码以来已经有一段时间了,但我试图确保我理解这里发生了什么。有人声明了这一点(在他们的代码中有更多成员):

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

然后他们将其用作 for 循环的一部分:

sizeof(trysizes)/sizeof*(trysizes)

我在想第一部分是数组中的字节数,第二部分必须是每个数组成员的大小,给我们数组中的项目数。这是计算数组长度的标准方法吗?第二个 sizeof 实际在做什么?

4

3 回答 3

15

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

sizeof(trysizes)/sizeof(*trysizes)

甚至更好

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

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

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

于 2012-07-27T21:21:26.277 回答
1

你说对了。分母中的第二个sizeof取消引用数组的第一个元素,产生 element 的大小0sizeof知道数组变量的总缓冲区大小 - 分子 - 所以这个习语将产生数组中元素的数量。

以我的经验,这是这个特殊习语的不常见表达,通常我见过,我使用

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

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

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

于 2012-07-27T21:21:48.483 回答
1

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

于 2012-07-28T03:05:19.367 回答