[C 的那些眉角]struct padding 和 alignment — 為什麼 sizeof 結果跟你算的不一樣

有一次在對接兩邊的通訊,一邊是 MCU,一邊是 PC 端的測試工具。協定 header 很單純:1 byte type、4 bytes length、2 bytes sequence,加起來 7 bytes。

我很有自信地在 MCU 這邊定義了一個 struct,直接 send() 整個 struct 出去。結果 PC 那邊收到的 length 永遠是亂碼,seq 更是一塌糊塗。

Wireshark 一抓,發現封包長度不是 7,竟然是 12。

原來,多出來的 5 個 byte,不是我寫的,是編譯器幫我「貼心」塞的。🙃

閱讀全文

[C 的那些眉角]sizeof 的陷阱 — 指標傳進函式就失效了

有一次在專案開發中,需要把收到的封包做 checksum 驗證。邏輯很單純,把 buffer 的每個 byte 加起來,對吧?

我寫了一個驗證函式,丟進去跑,結果 checksum 每次都不對。封包明明是對的,Wireshark 抓出來也沒問題,但我的函式就是算錯。

花了快一個小時在懷疑通訊協定、懷疑 byte order、懷疑硬體……最後發現問題出在 sizeof。一個我以為自己很熟的東西。

問題長這樣

簡化後的程式碼大概是這樣:

閱讀全文