从源代码示例开始(为了清晰起见,我修改了源代码,所以忽略“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'\0‘结束数组。变量ret应该保存字符串。但是,当我执行下面的代码时,我什么也得不到(空字符串)。
wchar_t *result = someFunction();
wcout << result << endl;这就是它变得奇怪的地方。如果我执行上述所有代码,我将一无所获。但是,如果我在wcout << str << endl; ()中添加someFunction(),那么一切看起来都很好,即下面的代码完成了它应该做的事情。
wchar_t *result = someFunction();
wcout << result << endl;TL:下面的博士代码没有打印出“结果”。相反,它不输出任何结果,结果为空白。如果我将wcout << str<< endl;添加到someFunction()中,问题就解决了。那是为什么,我怎样才能避免。
wchar_t *result = someFunction();
wcout << result << endl;发布于 2015-07-28 18:36:26
您正在返回指向在someFunction结束时超出作用域的自动存储的指针,因此没有正确的行为;如果在变量超出作用域后访问它会发生什么,这是未知的。如果确实需要返回wchar_t*,则需要使用静态数组,将指向缓冲区的指针传递到someFunction,或者动态分配内存(并让调用方负责释放该内存)。最好的做法可能是使用std::wstring而不是原始的wchar_t*。
发布于 2015-07-28 18:35:20
当您返回局部变量的地址时,此代码无法工作。wchar_t str1024的内存将被释放,直到someFunction()返回给调用者为止。
西登德:应该是str[50] = L'\0';而不是str[51] = L'\0'
为了使代码正常工作,您可以使用std::wstring并返回它的副本,或者稍后使用new[]和delete[]将内存分配给堆中的str。
在提出这样的问题之前,您可能应该更加熟悉C++。
https://stackoverflow.com/questions/31684282
复制相似问题