将 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中文网其他相关文章!