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



我想用C.中的实际函数替换以下宏

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

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

正如其他人所说,你不能。


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

一个问题是函数不能将数组作为参数。函数原型中的数组声明转换为指针声明。

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

另一个阻碍您的问题是,C没有泛型函数。除了使用void *参数和单独传递大小信息外,没有办法为函数提供"T的数组",其中T可以是您喜欢的任何类型。


然而,函数类似于在不同阶段展开的宏。它们在编译过程中被翻译;想象一下,在编译之前,将宏的代码复制并粘贴到它提到的任何地方,替换参数。这就是编译器对宏的作用。

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


p.S.sizeof不是函数;它是一个操作员。。。巧合的是,它是为数不多的(其他是运算符的&地址和新采用的_AlignOf运算符)不会导致数组表达式转换为指针表达式

int arraySz(void **a)
{ 
return(sizeof(a[])/sizeof(a[][]));
}

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

最新更新