# 2025q1 Homework4 (quiz3+4) contributed by < `LinMarc1210` > {%hackmd NrmQUGbRQWemgwPfhzXj6g %} ## 第三週 - 測驗 1 首先理解 `mpi_t` 這個結構,他定義成 `mpi_t[1]`,這樣之後變數直接宣告成 `mpi_t a` 時,`a`就直接是個指向 `mpi_t` 的指標了,因為長度為 1 的陣列,直接使用陣列名字時就相當於取得 `&mpi_t[0]` 。不知道為什麼特別這樣做,但我想是為了減少每次宣告 `mpi_t *` 還需要額外給指標一個已分配的記憶體。此外這個結構放了無號 32-bit 的整數指標作為資料**陣列**,並且後續將 `mp_bitcnt_t` 作為 unsigned 的型別使用。 ```c /* mpi: Multi-Precision Integers */ typedef struct { uint32_t *data; size_t capacity; } mpi_t[1]; typedef size_t mp_bitcnt_t; ``` 再來先理解一下記憶體相關的函式操作: - `mpi_init`: 初始化結構成員 - `mpi_clear`: 釋放結構裡的 `data` - `mpi_enlarge`: 若新的 `capacity` 大於 `rop` 的,則更新,並且重新分配 `rop->data` 的記憶體為 `capacity * 4`,因為 data 採用 `uint32_t` ,一個整數值代表 4 bytes。所以就是新增大小到給定的 `capacity` 並將新增的 data 空間初始化為 0 。 - `mpi_compact`: 從 `data` 陣列最後面檢查回來,如果 `capacity != (size_t) -1`,也就是 `data` 裡面還有東西,則繼續運行,後面則重新分配一次 capacity 與 data 的記憶體,讓 data 空間符合實際存放資料的數量而不會有多餘的。