乙個C C 結構體初始化有趣的現象

2022-04-04 05:28:19 字數 2498 閱讀 1426

我們知道c語言當中結構可以使用{}進行初始化,例如有結構體定義如下:

typedef struct type_t type_t;
我們可以使用下面的語句來初始化乙個變數:

struct type_t o =

但是如果像下面這樣來初始化,結果會是什麼呢?

type_t o = ;

其結果是依賴於編譯器的實現,筆者分別在vs2010和gcc下進行了測試,結果如下:

1. vs2010下c和c++的結果都是:

o.a = 8, o.b = 8, o.c = 8, o.d = 8

2. gcc的c編譯執行結果:

o.a = 8 o.b = 0, o.c = 0, o.d = 4195296

3. gcc的c++編譯執行結果:

o.a = 8, o.b = 8, o.c = 8, o.d = 8

為啥會這樣呢?帶著疑問,筆者又去看了一下反彙編的**,vs2010的反彙編**如下:

type_t o = ;

004113a8 mov dword ptr [ebp-18h],8

004113af mov eax,dword ptr [ebp-18h]

004113b2 mov dword ptr [ebp-14h],eax

004113b5 mov eax,dword ptr [ebp-14h]

004113b8 mov dword ptr [ebp-10h],eax

004113bb mov eax,dword ptr [ebp-10h]

004113be mov dword ptr [ebp-0ch],eax

這段**翻譯過來的意思就是:

o.a = 8;

eax = o.a

o.b = eax

eax = o.b

o.c = eax

eax = o.c

o.d = eax

gcc編譯的反彙編**:

=> 0x00000000004004cd <+9>:     mov    -0x20(%rbp),%ecx

0x00000000004004d0 <+12>: mov -0x1c(%rbp),%edx

0x00000000004004d3 <+15>: mov -0x18(%rbp),%eax

0x00000000004004d6 <+18>: movl $0x8,-0x20(%rbp)

0x00000000004004dd <+25>: mov %ecx,-0x1c(%rbp)

0x00000000004004e0 <+28>: mov %edx,-0x18(%rbp)

0x00000000004004e3 <+31>: mov %eax,-0x14(%rbp)

這段**可翻譯如下:

ecx=o.a

edx=o.b

eax=o.c

o.a=8

o.b=ecx

o.c=edx

o.d=eax

g++編譯的反彙編**:

=> 0x00000000004005ad <+9>:     movq   $0x0,-0x20(%rbp)

0x00000000004005b5 <+17>: movq $0x0,-0x18(%rbp)

0x00000000004005bd <+25>: movl $0x8,-0x20(%rbp)

0x00000000004005c4 <+32>: mov -0x20(%rbp),%eax

0x00000000004005c7 <+35>: mov %eax,-0x1c(%rbp)

0x00000000004005ca <+38>: mov -0x1c(%rbp),%eax

0x00000000004005cd <+41>: mov %eax,-0x18(%rbp)

0x00000000004005d0 <+44>: mov -0x18(%rbp),%eax

0x00000000004005d3 <+47>: mov %eax,-0x14(%rbp)

這段**翻譯如下:

將o變數清零

o.a = 8;

eax = o.a

o.b = eax

eax = o.b

o.c = eax

eax = o.c

o.d = eax

現在該完全清楚了,g++和vs2010生成的彙編指令基本一致,都是先將前乙個成員初始化後再進行取值。而gcc則是先將o的成員變數值全部儲存的暫存器中,然後逐一對o變數進行初始化。

但是所不明白的是為何gcc要這樣生成指令?

C C 結構體初始化

c語言結構體初始化,可以如下四種 include int main int argc,const char argv 初始化的4種方式 1.定義的同時初始化 struct person p1 2.先定義再逐個初始化 struct person p2 p2.name ykd p2.age 18 p2....

關於結構體初始化的乙個問題

開始自學程式設計,但是程式設計之路困難重重,於是我打算將學習之中遇到的問題以及解決方案貼在這裡,方便以後複習。那我今天總結了一下結構體初始化的幾種方法.如下 include include typedef struct student stu intmain 定義的同時初始化 stu s2 s2 s...

C C 建構函式初始化結構體

通常我們初始化結構體使用stu.id 1 或在讀入時進行賦值scanf d stu.id 當結構體內變數很多時很不方便。我們可以使用建構函式來解決這個問題。普通定義的結構體會生成預設建構函式studentinfo 使得我們可以只定義結構體變數而不用賦值。如果想要自己提供初始化引數,下面介紹兩種做法 ...