2017-08-04 89 views
0

我有,我想在我的程序初始化結構表用C

typedef struct MyStructT{ 
    int  Output; 
    int  Input1; 
    int  Input2; 

}; 
int n=100; 
MyStructT Table[n] = ?? ; 

我怎麼做的開始初始化結構表?

+0

它是否必須是一個可變長度數組?如果可以使用靜態或全局陣列(即它定義爲在編譯單元的水平,具有固定'#define'長度,而不是'N'),它將被初始化爲'0'。否則,在使用之前手動將其設置爲「0」。請注意,本地VLA變量通常放在堆棧中,因此在嵌入式環境中,您可能需要小心分配多少。 – Groo

回答

3

你不能做到這一點使用數組初始化因爲n在編譯時已知;即你有一個可變長度數組

的一種方法是循環在struct數組的每個元素,並手動初始化成員。它會彈出幾行很好。

另外,假設這樣的struct元件的C標準保證連續性,並memset 0是定義明確的初始化一個C struct的方式,你memset整個陣列:

memset (Table, 0, n * sizeof(struct MyStructT)); 
3

既然你有:

int n = 100; 
MyStructT Table[n]; 

你有一個VLA - 可變長度數組。你不能初始化VLA。期。不知何故,您必須編寫代碼將它們設置爲初始值。

標準(ISO/IEC 9899:2011 - C11)說,在§6.7.9初始化

¶3類型的實體被初始化應未知大小的陣列或一個完整的 不是可變長度數組類型的對象類型。

請注意,更改nconst int n = 100;不使用C幫助(雖然它會在C++ - 但C++不支持VLAS無論如何,儘管GCC讓他們)。

如果需求是設置元素的所有字節零,那麼你可以寫:

memset(Table, '\0', sizeof(Table)); 

這將做的工作。注意,sizeof(Table)值是在運行時評估,因爲Table是VLA。

或者,如果您確實不需要VLA,請將數組綁定到enum#define常量,然後您可以使用常規技術初始化陣列。

+0

如果我不初始化我的表是否有任何錯誤風險? – MrsIl

+3

沒有錯誤,除非你在寫信給他們之前調皮和閱讀元素。 – Bathsheba

+0

'sizeof(Table)'= flashy = upovote。我用這種表示法變得越來越乏味。 – Bathsheba