---
# System prepended metadata

title: Sturct & Union
tags: [C]

---

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)
