C函数中任意数组类型的长度

时间:2016-03-28 22:39:08

标签: c arrays sizeof

我想用C中的实际函数替换下面的宏。

#define ARRAY_LENGTH(a) (sizeof(a)/sizeof((a)[0]))

3 个答案:

答案 0 :(得分:1)

保持你的宏。替换它是一个错误。将数组传递给函数时,它会衰减为指针并丢失大小信息。

答案 1 :(得分:1)

正如其他人所说,你做不到。

将参数传递给函数时,该表达式的值将复制到新对象中。

一个问题是functions can't have arrays as arguments.函数原型中的数组声明被转换为指针声明。

类似地,表示您传递的数组的表达式将转换为指向数组的第一个元素的指针。

阻碍你的另一个问题是C没有泛型函数。没有办法提供带有“T数组”的函数,其中T可以是您喜欢的任何类型,除了使用void *参数并分别传递大小信息。

然而,在不同阶段扩展的类似函数的宏。它们在编译期间被翻译;想象一下,在编译之前复制并粘贴宏所提到的代码,替换参数。这就是你的编译器用宏做的事情。

例如,当您撰写printf("%zu\n", ARRAY_LENGTH(foo));时,它会将其替换为:printf("%zu\n", (sizeof(foo)/sizeof((foo)[0])));

P.S。 sizeof不是一个功能;它是一个运算符......巧合的是,它是为数不多的(其中一个是&地址 - 运算符和新采用的_AlignOf运算符)之一,它们不会导致数组表达式转换为指针表达式

答案 2 :(得分:-5)

~

然而 a 必须指向现有的矩形数组,而不仅仅是指向指针的指针,或者从 malloc()返回值。