Wchar_t为空,除非" wcout"用过的

时间:2015-07-28 18:24:19

标签: c++ visual-studio-2013 wchar-t

我会从一个源代码示例开始(我为了清楚起见而进行了修改,因此请忽略" someLetter"等变量):

wchar_t *someFunction()
{
    wchar_t str[1024] = L"";

    for (int i = 0; i < 50; i++)
    {
        str[i] = someLetter;
    }

    str[51] = L'\0';

    return str;
}

上面的代码只是将wchars添加到w_char数组中,当for循环结束时,它以L&#39; \ 0&#39;结束数组。变量ret应该保持字符串。 但是,当我执行下面的代码时,我什么都没得到(空字符串)。

wchar_t *result = someFunction();
wcout << result << endl;

这是奇怪的地方。如果我执行上面提到的代码,我什么也得不到。但是如果我在someFunction()中添加wcout << str << endl;,一切似乎都运行良好,即下面的代码执行它应该做的事情。

wchar_t *result = someFunction();
wcout << result << endl;

TL:DR 下面的代码不打印&#34;结果&#34;。相反,它没有打印出来,结果是空白的。如果我将wcout << str<< endl;添加到someFunction(),问题就解决了。为什么这样,我怎么能避免这种情况。

wchar_t *result = someFunction();
wcout << result << endl;

2 个答案:

答案 0 :(得分:2)

someFunction结束时,您正在返回指向超出范围的自动存储的指针,因此没有正确的行为;未定义如果在超出范围后访问变量将会发生什么。如果你真的需要返回wchar_t*,你需要使用静态数组,将指针传递给someFunction,或者动态分配内存(并让调用者负责释放记忆)。最好的办法可能是使用std::wstring而不是原始wchar_t*

答案 1 :(得分:1)

当您返回局部变量的地址时,此代码无法工作。释放wchar_t str [1024]的内存,直到someFunction()返回给调用者。

Sidenode:它应该是str[50] = L'\0';而不是str[51] = L'\0'

为了让您的代码正常工作,您可以使用std::wstring并返回它的副本,或者使用new []在堆上为str分配内存,稍后再删除[]。

在提出这样的问题之前,你应该对C ++有点熟悉。