C 字符串指针数组的大小?

C 字符串指针数组的大小?,c,arrays,pointers,C,Arrays,Pointers,我有这些字符串和指向这些字符串的指针数组,定义如下(在C中): 我需要将*str_table[](指针数组)传递给一个函数,该函数将扫描各种字符串以查找所有类型的内容。问题是我如何找出数组中指针的数量?似乎sizeof()不像我想象的那样工作。您需要sizeof(str_表)/sizeof(str_表[0])sizeof(str_table)将提供整个数组的大小(以字节为单位)。将其除以数组元素的大小将得到数组中的元素数。 现在,您还需要将此大小的数组与其他参数一起传递给函数。您需要sizeof

我有这些字符串和指向这些字符串的指针数组,定义如下(在C中):

我需要将
*str_table[]
(指针数组)传递给一个函数,该函数将扫描各种字符串以查找所有类型的内容。问题是我如何找出数组中指针的数量?似乎
sizeof()
不像我想象的那样工作。

您需要
sizeof(str_表)/sizeof(str_表[0])
sizeof(str_table)
将提供整个数组的大小(以字节为单位)。将其除以数组元素的大小将得到数组中的元素数。
现在,您还需要将此大小的数组与其他参数一起传递给函数。

您需要
sizeof(str_表)/sizeof(str_表[0])
sizeof(str_table)
将提供整个数组的大小(以字节为单位)。将其除以数组元素的大小将得到数组中的元素数。
(&str_table)[1] - str_table

现在,您还需要将此大小的数组与其他参数一起传递给函数。

只有在
str_table
变量可用时,才能恢复此信息。在这种情况下,您可以写:

(&str_table)[1] - 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);
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);
}
在函数内部,
arr
是类型为
const char**
的指针。没有提供长度信息

解决此问题的另一种方法是空终止数组。像这样:

const char *str_table[] = { str0, str1, str2, str3, NULL };

这与C字符串使用的思想完全相同。您可以只将数组传递给函数,函数可以在数组上迭代,直到遇到空指针。

只有当
stru 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);
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);
}
在函数内部,
arr
是类型为
const char**
的指针。没有提供长度信息

解决此问题的另一种方法是空终止数组。像这样:

const char *str_table[] = { str0, str1, str2, str3, NULL };

这与C字符串使用的思想完全相同。您可以只将数组传递给函数,函数可以在数组上迭代,直到遇到空指针。

您遇到的是所谓的“数组衰减”。有关详细信息,请参见问题。基本上,当一个数组被传递给一个函数时,你不能再对它执行
sizeof
,因为它已经“衰减”到一个指针,而
sizeof
只会返回指针的大小。您必须在数组仍然是数组时计算数组的大小,并将其传递到函数中


如果数组大小在编译时是固定的,上面链接的问题的答案还向您显示了另一个选项(请参见“按引用传递”方法)。

您所经历的是所谓的“数组衰减”。有关详细信息,请参见问题。基本上,当一个数组被传递给一个函数时,你不能再对它执行
sizeof
,因为它已经“衰减”到一个指针,而
sizeof
只会返回指针的大小。您必须在数组仍然是数组时计算数组的大小,并将其传递到函数中


如果数组大小在编译时是固定的,上面链接的问题的答案还向您显示了另一个选项(请参见“按引用传递”方法)。

要查找传入数组的函数中的字符串指针数,请终止数组,如下所示:

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);
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);
}
添加一个函数检查大小,如下所示:

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);
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);
}

要查找传入数组的函数中字符串指针的数目:终止数组,如下所示:

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);
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);
}
添加一个函数检查大小,如下所示:

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);
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);
}

size\u t array\u size=sizeof str\u table/sizeof str\u table[0]
@ivagrynko:如果将数组传递给function@MooingDuck当然,我的意思是
array\u size
应该作为参数传递给函数。是的,sizeof(str\u table)/sizeof(str\u table[0])可以工作,但是当我传递指针时,在函数内部,相同的代码不起作用。
size\u t array\u size=sizeof str\u table/sizeof str\u table[0]
@ivagrynko:如果将数组传递给function@MooingDuck当然,我的意思是
array\u size
应该作为参数传递给函数。是的,sizeof(str\u table)/sizeof(str\u table[0])可以工作,但是当我传递指针时,在函数内部,相同的代码不起作用。在函数内部,Op不想知道在数组被传递到函数中后如何获取数组的大小,这是使用您的方法无法完成的。@TripShock;编辑了答案。不在函数内部。OP想知道在数组被传递到函数中后如何获取数组的大小,这是使用您的方法无法完成的。@TripShock;编辑了答案。似乎是一种非常迂回的方法,可以获得与sizeof(str_table)/sizeof(str_table[0])相同的结果。@herohuyongtao
str_table
指向数组的开头,而
(&str_table)[1]
指向数组的结尾。似乎是一种非常迂回的方法,可以获得与sizeof(str_table)/sizeof(str_table[0])相同的结果。@herohuyongtao
str_table
指向数组的开头,而
(&str_table)[1]
指向数组的结尾。