2017-01-02 20 views
1

我有這樣的結構:當你不知道要在字符串中放入多少元素時,是否有方法來初始化結構中的字符串數組?

typedef struct SomeStruct { 
    char someString[]; 
} SomeStruct; 

由於當初始化someString的大小沒有被定義這產生一個錯誤。

我想使someString是一個字符串數組,但我不知道初始化時數組的大小。 (數組中的元素將在後面的程序中取決於用戶輸入)。

是否可以在不知道數組大小的情況下將其初始化爲字符串數組?

+1

改爲使用指針。 – 2017-01-02 01:37:04

+2

您的代碼片段顯示了一個字符數組,而不是一個字符串數組。 – derek

+0

對於字符串數組,'struct'內的類型必須是'char **' – jackarms

回答

2

是的,這個標準C會談7.2.18-26。你所描述的是一個結構體的靈活數組成員。從標準:

作爲一個特殊的情況下,與一個以上的命名構件的結構的最後一個元件可以具有一個不完整的陣列類型;這被稱爲靈活的數組成員。

本質上講它是在說,如果該結構的最後一個成員是未定義大小的數組(如可能是運行時的大小的情況下),然後使用該結構時,你會分配適當大小你的結構包括你想要的字符串的大小。例如:

typedef struct SomeStruct { 
    char someString[]; 
} SomeStruct; 

有靈活的數組成員someString。使用這種常見的方式是:

SomeStruct *p = malloc(sizeof (SomeStruct) + str_size); 

假設調用malloc的成功,指向的對象中由對行爲,對於大多數目的,如果p已宣佈:

struct {char someString[str_size]; } *p; 

閱讀標準瞭解更多細節。流行詞flexible array member也會出現很多信息。 wikipedia是一個很好的開始。

1

您可以使用具有靈活陣列的結構。例如,

typedef struct SomeStruct 
{ 
    size_t n; 
    char someString[]; 
} SomeStruct; 

其中n用於存儲數組中的元素數量。

然後,您可以創建結構的物體通過以下方式

SomeStruct *s = malloc(sizeof(SomeStruct) + 10 * sizeof(char[100])); 
s->n = 10; 
1

如果你不能使用動態數組(它聽起來像這樣,如果你得到一個編譯錯誤),你實際上可以超越數組,只要它在結構的末尾,因爲您實際上可以訪問該內存。例如:

#include <stdio.h> 
#include <stdlib.h> 

typedef struct SomeStruct { 
    char someString[10]; 
} SomeStruct; 

int main (void) 
{ 
    // Allocate 4x space, so we have room to overrun 
    SomeStruct *p = malloc(sizeof(SomeStruct) * 4); 

    p->someString[38] = 'a'; 
    printf("%c\n", p->someString[38]); 
} 

當然,您仍然必須實際分配空間,所以根據您的情況,它可能沒有那麼有用。

相關問題