C中是否有一个标准函数可以返回数组的长度?

use*_*466 24 c arrays

C中是否有一个标准函数可以返回数组的长度?

Mic*_*urr 66

通常,在其他答案中描述的技术被封装在宏中以使其更容易在眼睛上.就像是:

#define COUNT_OF( arr) (sizeof(arr)/sizeof(0[arr]))
Run Code Online (Sandbox Code Playgroud)

请注意,上面的宏使用了一个小技巧,即将数组名称放在索引运算符(' []')中而不是0- 如果宏在C++代码中错误地使用了一个重载项,则会这样做operator[]().编译器会抱怨而不是给出错误的结果.

但是,请注意,如果您碰巧传递指针而不是数组,宏将默默地给出错误的结果 - 这是使用此技术的主要问题之一.

我最近开始使用我从Google Chromium的代码库中窃取的更复杂的版本:

#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
Run Code Online (Sandbox Code Playgroud)

在这个版本中,如果指针被错误地作为参数传递,编译器会在某些情况下抱怨 - 特别是如果指针的大小不能被指针所指向的对象的大小整除.在这种情况下,除零将导致编译器出错.实际上至少有一个我用过的编译器给出了一个警告而不是一个错误 - 我不确定它为那个除以零的表达式生成了什么.

那个宏并没有关闭错误地使用它的大门,但是它就像我在直接看到的那样接近.

如果您想在C++中工作时使用更安全的解决方案,请查看Compile time sizeof_array,而不使用描述Microsoft使用的相当复杂的基于模板的方法的宏winnt.h.

  • @meguli在C中,数组索引表示法只是指针添加的简写.所以`arr [0]`变成`*(arr + 0)`和`0 [arr]`变成`*(0 + arr)`,这当然是等价的. (3认同)
  • 对于 Chromium 版本和使用 0[x] 的小技巧都+1。 (2认同)

Geo*_*che 14

不,那里没有.

对于常量大小的数组,你可以使用Andrew提到的常用技巧,sizeof(array) / sizeof(array[0])但这只适用于声明数组的范围.
sizeof(array)给出整个数组sizeof(array[0])的大小,同时给出第一个元素的大小.
请参阅Michaels关于如何将其包装在宏中的答案.

对于动态分配的数组,您可以跟踪整数类型的大小,或者在可能的情况下使其以0结尾(即分配1个元素并将最后一个元素设置为0).

  • 请注意,`sizeof(array)/ sizeof(array [0])`仅适用于声明数组的相同范围.我们不能将`array`传递给函数并期望代码能够工作. (13认同)

And*_*ico 5

sizeof array / sizeof array[0]
Run Code Online (Sandbox Code Playgroud)

  • 您应该解释这只适用于在编译时已知大小的固定大小的数组. (12认同)
  • 您可以使用“*array”进一步缩短它:-) (2认同)
  • 该表达式也适用于大小在运行时确定的 VLA(可变长度数组)。它不适用于动态分配的数组(通过 `malloc()` 等)。它也会在函数参数列表中的“数组”上失败——但无论如何它们都不是数组。 (2认同)