Sturct & Union === --- ###### tags: `C` 紀錄個 Struct & Union 我覺得蠻有趣的運作方式 --- # Source Code 直接看一下以下的 Struct,如果你知道這個 Struct 在記憶體怎放的,那就不用看這篇了 ```c= struct test { struct { int a; int b; }; union { struct { int c; int d; int e; }; int f; int g; }; int h; }; ``` # 解析 這個 test 中,Line 2 ~ 5 又包了一個 Struct 在概念上雖然 a、b 這兩個變數是一組的,在使用上其實只要直接 ```c= struct test T; T.a = 87; ``` 就好了 a 跟 b 的記憶體位置為順順排下去~ ``` Memory Layout: offset <- 變數名稱 0x0 <- T, T.a 0x4 <- T.b ``` 接著遇到一個 Union Union 的安排是,Union 裡頭的所有項目,一開始的位置都相同 所以說 - 包含 c、d、e 三個變數的 struct - f - g 他們的開頭位置都一樣 只是 c、d、e struct 裡面又含有更多東西,那他就從開頭位置繼續順排下去 所以 Layout 長這樣 ``` Memory Layout: offset <- 變數名稱 0x0 <- T, T.a 0x4 <- T.b 0x8 <- T.c, T.f, T.g 0xc <- T.d 0x10 <- T.e ``` 接著又回到最普通的 h Layout 最終長這樣 ``` Memory Layout: offset <- 變數名稱 0x0 <- T, T.a 0x4 <- T.b 0x8 <- T.c, T.f, T.g 0xc <- T.d 0x10 <- T.e 0x14 <- T.h ``` 以下附上實驗截圖 # 實驗截圖 ![](https://i.imgur.com/mUhKDgo.png) ![](https://i.imgur.com/h6DolNI.png)