我有这些字符串和指向这些字符串的指针数组(如C所示):
char str0[]= "Hello World";
char str1[]= "Byebye Baby";
char str2[]= "Regtime Girl";
char str3[]= "My Darling";
char *str_table[] = {str0,str1,str2,str3};
我需要将*str_table[]
(指针数组)传递给一个函数,该函数将扫描各种字符串以查找所有类型的事物。问题是如何找出数组中指针的数量?好像sizeof()
似乎无法正常工作。
答案 0 :(得分:4)
如果您有str_table
变量,则只能恢复此信息。在这种情况下,你可以写:
sizeof(str_table) / sizeof(str_table[0])
如果你试图计算一个接收数组作为参数的函数的长度,那就太晚了。此时您无法恢复信息。如果您处于该位置,则必须将长度传递给函数以及数组。
该功能可能如下所示:
void scan(const char* arr[], const size_t len)
{
for (size_t i=0; i<len; i++)
doSomething(arr[i]);
}
你这样称呼它:
size_t len = sizeof(str_table) / sizeof(str_table[0]);
scan(str_table, len);
在函数内部,arr
是const char**
类型的指针。没有提供长度信息。
解决此问题的另一种方法是将数组空终止。像这样:
const char *str_table[] = { str0, str1, str2, str3, NULL };
这与C字符串使用的想法完全相同。您可以只将数组传递给函数,函数可以遍历数组,直到遇到空指针。
答案 1 :(得分:1)
您需要sizeof(str_table) / sizeof(str_table[0])
。 sizeof(str_table)
将为您提供整个数组的大小(以字节为单位)。将它与数组元素的大小分开将给出数组中元素的数量
现在,您还需要将此大小的数组与其他参数一起传递给您的函数。
答案 2 :(得分:1)
您所遇到的是所谓的“阵列衰减”。有关详细信息,请参阅this问题。基本上,当一个数组传递给一个函数时,你不能再对它进行sizeof
因为它已经“衰减”到一个指针,而sizeof
只会返回指针的大小。当数组仍然是数组时,您必须计算数组的大小并将其传递给函数。
如果在编译时修复了数组大小,上面链接的问题的答案也会显示另一个选项(参见pass-by-reference方法)。
答案 3 :(得分:0)
(&str_table)[1] - str_table
答案 4 :(得分:0)
要查找传入数组的函数内的字符串指针数:终止数组,如下所示:
char *str_table[] = {str0,str1,str2,str3, NULL};
添加一个函数检查大小如下:
ssize_t elements_in_terminated_array(char ** pp)
{
ssize_t s = -1;
if (NULL != pp)
{
char ** tmp = pp;
while(*tmp)
{
++tmp;
}
s = tmp - pp;
}
return s;
}
int main(void)
{
ssize_t s = elements_in_terminated_array(str_table);
}