繁体   English   中英

指向字符串的数组的大小?

[英]size of array of pointers to strings?

我有这些字符串和指向这些字符串的指针数组,定义如下(在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()不能按我认为的那样工作。

如果您有可用的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字符串完全相同。 您可以仅将数组传递给函数,函数可以在数组上进行迭代,直到遇到空指针为止。

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

您正在体验的是所谓的“阵列衰减”。 有关细节,请参见此问题。 基本上,当数组传递给函数时,您无法再对其执行sizeof ,因为它已“衰减”了指针,而sizeof只会返回指针的大小。 您将必须计算仍为数组的数组的大小,并将其传递给函数。

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

(&str_table)[1] - str_table

要在传递了数组的函数中查找字符串指针的数量:终止数组,如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM