1

我是这样做的:

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;
}

它有效,但我只得到任何数字的第一个数字,而不是整数。如何以正确的方式做到这一点?

4

4 回答 4

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++ 中测量数组容量:)

您也可以使用 yourwchar_t* result = (wchar_t*)malloc(sizeof(wchar_t) * 10);而不是 my wchar_t *result = new wchar_t[10];- 我的解决方案只是有点清楚,但它也是如此。

于 2013-07-11T15:54:17.713 回答
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。希望它接近您使用的内容。这样做的主要好处是所有的内存管理、转换等都由库为您处理,您几乎无需手动滚动。

于 2013-07-11T16:05:32.577 回答
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();
}
于 2013-07-11T16:09:36.353 回答
1

你想的result是一串字符,这是很自然的思考。但是,严格地说,result不是一串字符,而只是起始字符的地址。因此,sizeof(result)不做你想的。尝试wcslen()wcsnlen()——尽管,实际上,您可能更喜欢学习 C++ 风格的字符串。

关于Convert1(),你是对的: result是一个本地数组,分配在堆栈上,当它的函数返回时被释放。

顺便说一句,您Convert2()可能会泄漏内存,这取决于调用者如何处理它。出于这个原因,您可能更喜欢让它返回一个std::shared_ptror,更好的是,而不是一个普通的指针。std::unique_ptr

于 2013-07-11T16:07:43.927 回答