繁体   English   中英

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

[英]Length of arbitrary array type in C function

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

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

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

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


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

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

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

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


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

例如,当你写printf("%zu\\n", ARRAY_LENGTH(foo)); 它替换为: printf("%zu\\n", (sizeof(foo)/sizeof((foo)[0])));


PS sizeof不是函数; 它是一个运算符......巧合的是,它是为数不多的(其他是& address-of运算符和新采用的_AlignOf运算符)之一,它们不会将数组表达式转换为指针表达式

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

然而一个将必须被指向到现有的矩形阵列,而不是只是一个指向指针的指针,或通过malloc返回值()。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM