本文的測試均在vs2015的開發環境下測試。
陣列與結構體初始化方法
假設結構體為:
struct node
;
1.定義變數後,再初始化int array[5]
;array[0]
=0;array[1]
=1;array[2]
=2;array[3]
=3;array[4]
=4;//也可以用迴圈來賦值
struct node node;
node.a =0;
node.b =1;
node.c =2;
//不好用迴圈來賦值
這樣方便初始化不同的值,但較為麻煩。
2.花括號初始化
int array[5]
=;
struct node node =
;
這樣,將依次對元素(成員)賦值。
如果花括號裡的元素少於陣列長度(成員個數),那麼資料剩下的陣列(成員)將為預設為0。
利用這個特性,可以方便地全部初始化為0,例如:
int array[5]
=;//因為賦值的元素只有乙個,小於陣列長度5;故陣列第乙個位置(array[0])手動初始化為0,其他位置預設初始化為0.
struct node node =
;//因為賦值的元素只有乙個,小於成員數;故結構體第乙個成員初始化為0,其他成員預設初始化為0.
3.memset初始化為0
該方法只適合將資料全部初始化為0。
memset原型:
void *memset(void *s, int ch, size_t n);memset函式以位元組為單位,將 s 指向的 n 個位元組空間,全部置為0。
例如,
int array[5]
;memset
( array,0,
sizeof
( array));
//陣列全部初始化為0
memset
( array,1,
sizeof
( array));
//資料並未初始為1,而是初始化為16843009
// 16843009 對應的16進製為:0x01 01 01 01
struct node node;
memset
(&node,0,
sizeof
( struct node ));
//陣列全部初始化為0
陣列和結構體不初始化會出現什麼結果?
結構體不初始化,編譯不會報錯,但是執行時會出錯:
一種錯誤」初始化「結構體方法…不過還是建議了解下
結構體為:
struct node
;
結構體亂序初始化:struct node node =
;
結構體初始化結果:
a =
1b =
2c =
3d =
4e =
5請按任意鍵繼續.
..
結構體亂序初始化:struct node node =
;
結構體初始化結果:
a =
1b =
2c =
2d =
4e =
5請按任意鍵繼續.
..
可以看出這樣初始化方法,順序初始化,結果是正確的;但是一旦亂序,結果就錯誤了,亂序初始化的元素會相互影響。
原因
我們先看乙個小例子:
int a =
0, b =0;
b = a =7;
// 該語句完成後,a 和 b 均為 7.
這種初始化方法,其實屬於花括號初始化的方法;再把逗號之間看作一條語句,則有:
struct node node =
;
這樣就相對容易理解了。
語句1:
先給node.a賦1;又因為語句1在花括號的第乙個位置上,故將node.a賦給node結構體的第乙個成員(node.a),即可以理解為 node.a=node.a=1;故node.a=1。
語句2:
先給node.c賦3;又因為語句2在花括號的第二個位置上,故將node.c賦給node結構體的第二個成員(node.b),即可以理解為 node.b=node.c=3;故node.b=3。
語句3:
先給node.b賦2;又因為語句3在花括號的第三個位置上,故將node.b賦給node結構體的第三個成員(node.c),即可以理解為 node.c=node.b=2;故,此時 node.b=2,node.c=2。
語句4:
先給node.d賦4;又因為語句4在花括號的第四個位置上,故將node.d賦給node結構體的第四個成員(node.d),即可以理解為 node.d=node.d=4;故node.d=4。
語句5:
先給node.e賦5;又因為語句5在花括號的第五個位置上,故將node.e賦給node結構體的第五個成員(node.e),即可以理解為 node.e=node.e=5;故node.e=5。
這樣「初始化」完成後,結構體的a,b,c,d,e就分別為:1, 2, 2, 4, 5。
所以說這是中錯誤的"初始化"方法。
結構體初始化是否有其他亂序初始化方法?
如參考資料[1]所說,c語言結構體初始化可以亂序賦值;但是我在vs2015上測試中,發現參考資料[1]中的方法
三、方法四,並不能通過編譯。
所以我猜測這種亂序初始化的方法可能是linux c的方法,回頭測試了,在寫在這。
補充:
我在linux c下程式設計測試了下,參考資料[1]中的方法
三、方法四均是linux c的方法;並且可以實現亂序初始化。
經查資料得知,下圖中的第一種亂序初始化方法(注釋掉的部分)是c99支援的;第二種亂序初始化方法(未注釋掉的)是gcc支援的方法。
由於vs2015不支援c99,編譯器也不是gcc,所以這兩種方法都不支援。
[1]c語言結構體初始化的四種方法
C語言結構體初始化
1 2 test.c 3 2018 1 30 4 5 include 6 7 struct studen 12 13 14 15 int main void 16 19 20 number two 先定義再乙個個初始化 21 struct studen std2 22 std2.id 120 23 ...
C語言結構體的初始化
今天在工作時,看到了奇葩的結構體初始化方式,於是我查了一下c99標準文件和gcc的說明文件,終於搞清楚是怎麼回事了。假設有如下結構體定義 typedef struct mystruct 那麼結構體的初始化方式如下有三種 1 c89的初始化方式 mystruct test 這種初始化的優點是語法簡單,...
C語言騷操作 結構體初始化方法
首先定義倆結構體 typedef struct s0 typedef struct s1 首先想到的初始化方法是 s0 s s.a0 1 s.b0 2 s1 ss ss.a1 3 ss.b1 4 ss.s0 s 或者是 s0 s s1 ss 但是很多人不知道其實還可以這樣初始化 用大括號括起來的病省...