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 中国語 Web サイトの他の関連記事を参照してください。