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

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

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

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

問題長這樣

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

閱讀全文

[C 的那些眉角]指標與陣列的關係 — 從根本搞清楚

寫 C 寫了好幾年,我一直以為自己搞懂指標跟陣列的關係了。

直到有一次,我在一個跨檔案的專案裡,某個 .c 檔宣告了 char buf[256],另一個 .c 檔用 extern char *buf 去引用它。編譯過了,連結也過了,一跑就 segfault。

我盯著螢幕看了十分鐘,心裡想:「這兩個不是一樣的東西嗎?」

不是。這篇就是要把這件事從根本講清楚。

🧠 陣列不是指標,指標不是陣列

先把結論放前面:陣列和指標是兩種完全不同的東西,只是在某些場景下行為很像,像到讓人誤以為它們是同一個東西。

int arr[5] = {10, 20, 30, 40, 50};
int *ptr = arr;

閱讀全文