我是这样做的:
static wchar_t* Convert1(tDWORD data)
{
wchar_t result[10];
swprintf(result, sizeof(result) / sizeof(*result), L"%d", data);
wprintf(L"[%ls]\n", result);
return result;
}
它没有用,我猜是因为堆栈内存在返回后已被清除(有人可以向我解释原因吗?)。然后我试着这样:
static wchar_t* Convert2(tDWORD data)
{
wchar_t* result = (wchar_t*)malloc(sizeof(wchar_t) * 10);
swprintf(result, sizeof(result) / sizeof(*result), L"%d", data);
wprintf(L"[%ls]\n", result);
return result;
}
它有效,但我只得到任何数字的第一个数字,而不是整数。如何以正确的方式做到这一点?
答案 0 :(得分:4)
试试这个:
static wchar_t* Convert1(tDWORD data)
{
wchar_t *result = new wchar_t[10];
swprintf(result, 10, L"%d", data);
wprintf(L"[%ls]\n", result);
return result;
}
您尝试返回局部变量(数组)的地址 - 返回其范围后会清除局部变量。这就是为什么你说内存被清除了。另外,像这样分配内存:wchar_t result[10]
是在堆栈上分配内存。像这样分配:new wchar_t[10]
正在堆上分配内存。
另外,我用sizeof(result) / sizeof(*result)
替换了10
。不幸的是,您无法在C ++中测量数组容量:)
您也可以使用wchar_t* result = (wchar_t*)malloc(sizeof(wchar_t) * 10);
代替wchar_t *result = new wchar_t[10];
- 我的解决方案有点明确,但也是如此。
答案 1 :(得分:3)
考虑使用字符串流和by-val wstring,例如:
#include <iostream>
#include <sstream>
#include <string>
#include <cstdint>
using namespace std;
typedef uint32_t tDWORD;
static std::wstring Convert1(tDWORD data)
{
std::wostringstream os;
os << data;
return os.str();
}
int main(int argc, char *argv[])
{
tDWORD dwTest = 1024;
std::wstring res = Convert1(dwTest);
std::wcout << res << std::endl;
return EXIT_SUCCESS;
}
<强>输出强>
1024
抱歉,我不得不伪造typedef。希望它接近你所使用的。这样做的主要好处是所有内存管理,转换等都由图书馆为您处理,不得不亲自手动滚动。
答案 2 :(得分:2)
在第一种情况下,您将返回指向堆栈上缓冲区的指针,该函数将在函数返回时被销毁。在第二种情况下,您将分配调用者必须负责的内存。
试试这个:
static std::wstring Convert1(DWORD data)
{
const size_t bufferSize = 10;
wchar_t result[bufferSize];
swprintf(result, bufferSize, L"%d", data);
return result;
}
或更多C ++方法......:
static std::wstring Convert1(DWORD data)
{
std::wostringstream stream;
stream << data;
return stream.c_str();
}
答案 3 :(得分:1)
您正在考虑将result
视为一串字符,这是一种自然而然的思考方式。但是,严重地说,result
不是字符串,而是仅初始字符的地址。因此,sizeof(result)
并不符合您的想法。试试wcslen()
或wcsnlen()
- 但是,您可能更喜欢做的是学习C ++风格的字符串。
关于Convert1()
,你是对的:result
是一个本地数组,在堆栈上分配,在函数返回时解除分配。
顺便说一句,你的Convert2()
可能会泄漏内存,具体取决于其调用者如何处理内存。出于这个原因,您可能更愿意让它返回std::shared_ptr
或更好的std::unique_ptr
,而不是普通指针。