將char 轉換為wchar_t:探索解並解決函數錯誤
轉換字元數組(char ) 轉換為寬字元陣列(wchar_t) 是UNICODE 程式設計中常見的任務。雖然存在各種方法,但我們將重點放在遇到問題的特定實現。
提供的程式碼片段:<code class="C++">const wchar_t *GetWC(const char *c) { const size_t cSize = strlen(c)+1; wchar_t wc[cSize]; mbstowcs (wc, c, cSize); return wc; }</code>旨在透過指派本機 wchar_t 來執行轉換緩衝區 wc 與輸入字串的大小相同。然而,這種方法並沒有如預期般運作。 問題源自於 wc 在函數中被宣告為局部變數。當函數呼叫結束時,為 wc 分配的記憶體將被釋放,從而導致未定義的行為。 要解決此問題,我們必須確保分配的 wchar_t 緩衝區在函數的生命週期之外持續存在。適當的修復是:
<code class="C++">const wchar_t *GetWC(const char *c) { const size_t cSize = strlen(c)+1; wchar_t* wc = new wchar_t[cSize]; mbstowcs (wc, c, cSize); return wc; }</code>透過使用 new 分配 wchar_t 緩衝區,我們在堆上保留內存,當函數返回時不會釋放這些內存。然而,釋放該記憶體的責任現在落在了呼叫代碼身上,以避免記憶體洩漏。
以上是為什麼將 char 陣列轉換為 wchar_t 會導致此程式碼中出現未定義的行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!