我需要指定char指针数组的长度作为C中函数的输入。我认为在C中没有任何技巧就不可能知道这一点(例如迭代直到找到特定的定点字符串) ),但我想知道gcc是否具有某些功能可以为我提取此功能?
const char *names[] = {"string1","next_string","test"};
//Later in code
int n_fields = <magic>(names);
在这种情况下,我希望n_fields
为3。
我当前的替代方法是手动计数并指定长度,但这意味着我需要确保这两个值保持手动链接。
针对重复问题进行编辑:与整数数组不同,对我而言,其他示例中的两个sizeof参数对于char指针数组的测量并不明显。我特别认为分母可能是在测量字符串的长度,而实际上却是在测量指针的大小。几乎每个在线示例都是针对一个整数数组,而不是char指针。
答案 0 :(得分:1)
当然可以:
#define ARRAY_SIZE(names) (sizeof(names)/sizeof((names)[0]))
#include <stdio.h>
const char *names[] = {"string1","next_string","test"};
//Later in code
int n_fields = ARRAY_SIZE(names);
int main()
{
printf("%d\n", n_fields); //prints 3
}
请记住,您需要确保将ARRAY_SIZE
应用于实际数组,而不是指针。
void f (const char *names[])
{
//!WRONG: names is actually a pointer here
printf("%d\n", (int)ARRAY_SIZE(names));
}
为了保护自己,您可以使用一些gcc / clang / tcc扩展来增强ARRAY_SIZE
,以使上面的摘录中的错误代码不再编译,但是带有真实数组的示例继续:
#define ARRAY_SIZE(X) ( 0*sizeof(char [ \
__builtin_types_compatible_p(__typeof(X),__typeof((X)+0)) ?-1:1 ] ) \
+sizeof(X)/sizeof((X)[0]) )
一旦数组衰减为指针,就无法再通过标准方法恢复原始大小,这就是为什么采用数组参数(实际上是指针参数)的函数(其中数组不以前哨终止)通常也接受数组的原因尺寸参数。