Wchar_t 空除非 "wcout" 使用
Wchar_t empty unless "wcout" used
我将从一个源代码示例开始(为了清楚起见,我修改了源代码,因此忽略了像 "someLetter" 这样的变量):
wchar_t *someFunction()
{
wchar_t str[1024] = L"";
for (int i = 0; i < 50; i++)
{
str[i] = someLetter;
}
str[51] = L'[=12=]';
return str;
}
上面的代码只是将wchars添加到w_char数组中,当for循环结束时,它以L'\0'结束数组。变量 ret 应该保存字符串。
但是,当我执行下面的代码时,我什么也没得到(空字符串)。
wchar_t *result = someFunction();
wcout << result << endl;
这就是奇怪的地方。如果我执行上面提到的所有代码,我什么也得不到。但是,如果我在 someFunction() 中添加 wcout << str << endl;
,一切似乎都工作正常,即下面的代码完成了它应该做的事情。
wchar_t *result = someFunction();
wcout << result << endl;
TL:DR
下面的代码没有打印出 "result"。相反,它什么也不打印,结果是空白的。如果我将 wcout << str<< endl;
添加到 someFunction() ,问题就解决了。为什么会这样,我该如何避免。
wchar_t *result = someFunction();
wcout << result << endl;
此代码无法工作,因为您 return 局部变量的地址。 wchar_t str[1024] 的内存被释放直到 someFunction() returns 到调用者。
旁白:应该是str[50] = L'[=10=]';
而不是str[51] = L'[=11=]'
为了让代码正常工作,您可以使用 std::wstring
和 return 的副本,或者使用 new[] 为堆上的 str 分配内存,稍后再删除 [] .
在问这样的问题之前,您可能应该更熟悉 C++。
您正在 return 指向自动存储的指针,该指针在 someFunction
结束时超出范围,因此没有正确的行为;如果您在变量超出范围后访问该变量,将会发生什么情况是不确定的。如果你真的需要 return a wchar_t*
,你需要使用静态数组,将指向缓冲区的指针传递到 someFunction
,或者动态分配内存(并使调用者负责释放该内存)。最好的办法可能是使用 std::wstring
而不是原始 wchar_t*
s.
我将从一个源代码示例开始(为了清楚起见,我修改了源代码,因此忽略了像 "someLetter" 这样的变量):
wchar_t *someFunction()
{
wchar_t str[1024] = L"";
for (int i = 0; i < 50; i++)
{
str[i] = someLetter;
}
str[51] = L'[=12=]';
return str;
}
上面的代码只是将wchars添加到w_char数组中,当for循环结束时,它以L'\0'结束数组。变量 ret 应该保存字符串。 但是,当我执行下面的代码时,我什么也没得到(空字符串)。
wchar_t *result = someFunction();
wcout << result << endl;
这就是奇怪的地方。如果我执行上面提到的所有代码,我什么也得不到。但是,如果我在 someFunction() 中添加 wcout << str << endl;
,一切似乎都工作正常,即下面的代码完成了它应该做的事情。
wchar_t *result = someFunction();
wcout << result << endl;
TL:DR
下面的代码没有打印出 "result"。相反,它什么也不打印,结果是空白的。如果我将 wcout << str<< endl;
添加到 someFunction() ,问题就解决了。为什么会这样,我该如何避免。
wchar_t *result = someFunction();
wcout << result << endl;
此代码无法工作,因为您 return 局部变量的地址。 wchar_t str[1024] 的内存被释放直到 someFunction() returns 到调用者。
旁白:应该是str[50] = L'[=10=]';
而不是str[51] = L'[=11=]'
为了让代码正常工作,您可以使用 std::wstring
和 return 的副本,或者使用 new[] 为堆上的 str 分配内存,稍后再删除 [] .
在问这样的问题之前,您可能应该更熟悉 C++。
您正在 return 指向自动存储的指针,该指针在 someFunction
结束时超出范围,因此没有正确的行为;如果您在变量超出范围后访问该变量,将会发生什么情况是不确定的。如果你真的需要 return a wchar_t*
,你需要使用静态数组,将指向缓冲区的指针传递到 someFunction
,或者动态分配内存(并使调用者负责释放该内存)。最好的办法可能是使用 std::wstring
而不是原始 wchar_t*
s.