我会从一个源代码示例开始(我为了清楚起见而进行了修改,因此请忽略" 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;
答案 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 ++有点熟悉。