簡體   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