是否可以在C中提取char指针数组的大小

时间:2018-09-16 18:29:33

标签: c gcc

我需要指定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指针。

1 个答案:

答案 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]) )

一旦数组衰减为指针,就无法再通过标准方法恢复原始大小,这就是为什么采用数组参数(实际上是指针参数)的函数(其中数组不以前哨终止)通常也接受数组的原因尺寸参数。