字符串指针数组的大小?

时间:2014-03-06 17:21:24

标签: c arrays pointers

我有这些字符串和指向这些字符串的指针数组(如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()似乎无法正常工作。

5 个答案:

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

在函数内部,arrconst 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);
}