簡體   English   中英

c中固定長度字符串的數組

[英]Array of fixed length strings in c

我想以指針的形式在c中有一個固定長度的字符串數組,以便為​​它動態分配內存。 我可以看到很多對字符串指針數組的引用,但是對我想要實現的卻沒有。

我想要的是能夠聲明一個指向char [MAX_STRING_LENGTH]的指針,以便隨后為所有字符串動態分配一個連續的內存塊:

char *(names[MAX_STRING_LENGTH]);  // This won't work
names = (some cast)malloc(NUM_STRINGS * MAX_STRING_LENGTH);

然后訪問字符串數組:

strcpy(name, names[stringIndex]);

如何聲明變量並從malloc轉換指針?

您將names聲明為指針數組,而不是指向數組的指針。 那會是

char (*names)[MAX_STRING_LENGTH];  // Names is a pointer to an array of char

現在,您可以為指針分配內存:

// Allocate memory for NUM_STRINGS arrays and assign the pointer to names
names = malloc(NUM_STRINGS * sizeof *names);

您想要一個使用cdecl指向char數組MAX_LENGTH的指針(請注意cdecl不理解MAX_LENGTH之類的東西,因此我們在這里改用數字):

% cdecl
Type `help' or `?' for help
cdecl> declare names as pointer to array 256 of char;
char (*names)[256]

我們得到正確的聲明是

char (*names)[MAX_LENGTH];

然而,這還不是非常有用的,因為realloc通貨膨脹將是非常昂貴的,因為它可能是最好每一位串移動到新位置。 因此,我建議您仍然使用指向char的指針

一些程序員已經提供了解決方案。

通常,由於C / C ++類型可能會變得有些棘手,因此您可以利用任何半透明的IDE查找正確的類型定義。

此技巧依賴於C ++ 11 auto關鍵字,該關鍵字從其初始值設定項確定變量類型。 結果類型仍然可以在其他C / C ++版本中使用,並且不僅限於C ++ 11。

根據您的情況,指定一種您知道的類型,可以將其轉換為所需的類型:

char names[10][10];

然后分配一個具有所需類型的auto變量:

auto names2 = &names[0];

檢查名稱的實際類型names2並使用它。 例如,在Visual Studio中,只需將鼠標懸停在names2即可查看類型。 大多數IDE都將鼠標懸停在auto關鍵字或定義的變量上來顯示類型。

對於該示例,懸停將顯示char (*names2)[10]

您需要了解Pointer Arrays的概念。請參閱Dennis M. Ritchie&Kernighan撰寫的“ C編程語言”一書。 特別是指針和數組部分。有一些很棒的東西要閱讀。 閱讀並解決了本書中給出的一些問題之后,您可能會更深入地了解指針和數組的概念。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM