Linux GNU C結構體陣列初始化示例

2021-07-23 13:53:40 字數 2514 閱讀 9225

突然心血來潮,想學習一下結構體陣列的初始化方面的知識。

gcc特有的陣列初始化的風格:

// 陣列賦值另一種方式,但只在gcc下編譯通過,g++不能

enum ;

// 只對感興趣的索引值進行賦值,而不管下標的順序

static const int regs = ;

這種風格在kernel**中經常看到。它不按照陣列下標順序,而是使用自定義的「索引」來賦值,比如intel網絡卡igb驅動中一處**:

static const struct e1000_info *igb_info_tbl = ;
從**中可以清晰知道,這個結構體是針對82575的——board_82575比數字0更直觀易讀。

但是使用g++卻無法編譯,編譯錯誤提示如下:

sorry, unimplemented: non-trivial designated initializers not supported
下面再看看結構體陣列的初始化,先給出結構體的定義:

enum control_type

;typedef struct control_info_t control_info;

初始化方式一,依次給陣列內元素賦值,如下::

control_info control_info1[3] = ,,

,};

方式二,先宣告再賦值,如下:

control_info control_info[3];

control_info[type_spi].name = "foo_spi";

control_info[type_spi].type = type_spi;

control_info[type_spi].enable = 1;

方式三,不按照順序,只對感興趣幾項賦值,如下:

control_info control_info2[3] = 

,[type_gpio] = ,

};

從這個方式上看,型別為spi的「索引值」對應即為spi,但無須理會型別spi的具體值。

/**

結果:struct test

250 0 180 3

111 name: foo_iic type: 1 enable: 0

222 name: foo_gpio type: 0 enable: 1

333 name: foo_spi type: 2 enable: 1

*/#include #include ///

// 簡單int型別的陣列

// 陣列賦值另一種方式,但只在gcc下編譯通過,g++不能

enum ;

// 只對感興趣的索引值進行賦值,而不管下標的順序

static const int regs = ;

void struct_test1()

///// 結構體陣列初始化示例

enum control_type

;typedef struct control_info_t control_info;

void struct_test_2()

; // 三個依次賦值

control_info control_info1[3] = ,,

,};

printf("111 name: %s type: %d enable: %d\n", control_info1[type_iic].name, control_info1[type_iic].type, control_info1[type_iic].enable);

// gnu風格賦值

control_info control_info2[3] =

,[type_gpio] = ,

};printf("222 name: %s type: %d enable: %d\n", control_info2[type_gpio].name, control_info2[type_gpio].type, control_info2[type_gpio].enable);

// 只有乙個賦值

control_info control_info[3];

control_info[type_spi].name = "foo_spi";

control_info[type_spi].type = type_spi;

control_info[type_spi].enable = 1;

printf("333 name: %s type: %d enable: %d\n", control_info[type_spi].name, control_info[type_spi].type, control_info[type_spi].enable);

}int main(void)

李遲 2016.10.13 周四  中午午休前

結構體 結構體陣列

void test 函式遞迴呼叫 允許函式體裡再次呼叫函式本身 使用遞迴一定要有出口 long fact int n return n fact n 1 定義乙個新的資料型別 struct mypoint 結構體型別所占用的記憶體空間是最大資料型別的整數倍。因為結構體型別的變數在分配記憶體時有記憶體...

結構體 結構體陣列

struct 結構體型別名 型別名 成員名 型別名 成員名 先宣告結構體型別,再定義結構體變數名 宣告結構體型別,不分配空間 定義結構體型別變數,就要分配記憶體空間 作 者 hh 完成日期 2018年8月15日 版本號 v1.0 問題描述 結構體巢狀 賦值 輸出 輸入描述 程式輸出 include ...

結構體陣列

陣列元素可以是任何的簡單資料型別,當然也可以是陣列 現在我們說陣列的元素也可以是結構型別的。可以構成結構型陣列。在實際應用中,經常用結構陣列來表示具有相同資料結構的乙個群體。如乙個班的學生檔案,乙個車間職工的工資表等。結構陣列的定義方法和結構變數相似,只需說明它為陣列型別即可。例如 include ...