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

问题描述 投票:1回答:1

这个问题在这里已有答案:

我需要指定一个char指针数组的长度作为C中函数的输入。我不认为有可能在没有一些技巧的情况下在C中知道这个(比如迭代直到找到某个sentinel字符串),但是我想知道是否gcc有一些功能可以为我提取这个?

const char *names[] = {"string1","next_string","test"};

//Later in code
int n_fields = <magic>(names);

在这种情况下,我会寻找n_fields为3。

我目前的替代方案是手动计数和指定长度,但这意味着我需要确保这两个值保持手动链接。

关于重复问题的编辑:与整数数组不同,我不清楚其他示例中的两个sizeof参数将测量一个char指针数组。具体来说,我认为分母可能是测量字符串长度,而实际上它是测量指针的大小。几乎每个在线示例都是针对一组int,而不是char指针。

c gcc
1个回答
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]) )

一旦数组衰减到指针,原始大小就不能再通过标准方法恢复,这就是为什么采用数组参数(实际上是指针参数)的数组,其中数组没有用sentinel终止,通常也接受数组大小参数。

© www.soinside.com 2019 - 2024. All rights reserved.