C語言 陣列與結構體初始化方法

2021-09-27 06:30:53 字數 3524 閱讀 4118

本文的測試均在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 但是很多人不知道其實還可以這樣初始化 用大括號括起來的病省...