在 C 語言開發中,當函數的回傳型別為自訂結構體時,如何表達「無效」或「空值」是個常見問題。由於結構體無法像指標那樣直接回傳 NULL,也不能像整數那樣用 0 表示空值,開發者需要自行定義一套機制。本文整理三種實務上常見的做法,並說明適用情境。
最直觀的方式是將函數回傳型別改為 StructType*。呼叫端若收到 NULL 即代表無效結果。這樣做語意最清晰,也符合 C 語言慣用模式(如 malloc 失敗回傳 NULL)。缺點是呼叫端需自行管理記憶體釋放,且若函數內部宣告區域變數並回傳其位址會造成未定義行為,必須動態配置或使用靜態/全域變數。
既然結構體是自訂型別,開發者可自行規定:當某幾個關鍵欄位同時為特定值(例如 id == 0 && count == 0)時,視為該結構體實例無效。優點是函數簽名維持 StructType 回傳,呼叫端無須處理指標;缺點是需額外檢查邏輯,且若合法資料恰好符合該組合會產生誤判。
在結構體定義中加入 int valid; 或 bool is_valid;,1 代表有效、0 代表無效。這是最直觀且擴充性最好的做法:不影響既有欄位語意、檢查邏輯簡單(if (!result.valid)),也方便未來擴充更多狀態(如 2 代表部分資料)。缺點是佔用額外幾個位元組記憶體,但在現代系統通常可忽略不計。
採用統一規範並撰寫文件,能有效降低團隊協作時的誤解與除錯成本。