C++ 如何从int转换为wchar\u t*?

C++ 如何从int转换为wchar\u t*?,c++,C++,我是这样做的: 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 =

我是这样做的:

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;
}
但它不起作用,我想是因为堆栈内存在返回后被清除了,有人能解释一下原因吗?。然后我试着这样:

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;
}
它是有效的,但我只得到任何数字的第一位,而不是整个数字。如何以正确的方式进行

试试这个:

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;
}
static std::wstring Convert1(DWORD data) 
{
  const size_t bufferSize = 10;
  wchar_t result[bufferSize];
  swprintf(result, bufferSize, L"%d", data);
  return result;
}
您试图返回局部变量数组的地址-局部变量在返回其作用域后被清除。这就是为什么你说记忆被清除了。另外,像这样分配内存:wchar_t result[10]就是在堆栈上分配内存。这样分配:新的wchar\u t[10]在堆上分配内存

另外,我将sizeofresult/sizeof*结果替换为10。你不能在C++中测量数组容量,不幸的是:

您还可以使用您的wchar\u t*结果=wchar\u t*mallocsizeofwchar\u t*10;而不是我的wchar\u t*result=new wchar\u t[10];-我的解决方案只是有点清楚,但它的作用是相同的。

试试这个:

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;
}
static std::wstring Convert1(DWORD data) 
{
  const size_t bufferSize = 10;
  wchar_t result[bufferSize];
  swprintf(result, bufferSize, L"%d", data);
  return result;
}
您试图返回局部变量数组的地址-局部变量在返回其作用域后被清除。这就是为什么你说记忆被清除了。另外,像这样分配内存:wchar_t result[10]就是在堆栈上分配内存。这样分配:新的wchar\u t[10]在堆上分配内存

另外,我将sizeofresult/sizeof*结果替换为10。你不能在C++中测量数组容量,不幸的是:


您还可以使用您的wchar\u t*结果=wchar\u t*mallocsizeofwchar\u t*10;而不是我的wchar\u t*result=new wchar\u t[10];-我的解决方案只是有点清楚,但它的作用是相同的。

考虑使用字符串流和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;
}

对不起,我不得不伪造typedef。希望它与您使用的接近。这样做的主要好处是,所有的内存管理、转换等都由库来处理,您几乎不需要手动滚动。请考虑使用字符串流和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;
}
对不起,我不得不伪造typedef。希望它与您使用的接近。这样做的主要好处是,所有的内存管理、转换等都由库来为您处理,您几乎不需要手动滚动任何内容。

您将结果视为一个字符串,这是很自然的想法。然而,严格地说,结果不是字符串,而是初始字符的地址。因此,sizeofresult不会做您认为的事情。尝试wcslen或wcsnlen,但实际上,您可能更喜欢学习C++风格的字符串

关于Convert1,您是对的:结果是一个本地数组,在堆栈上分配,在其函数返回时解除分配

顺便说一句,您的Convert2可能会泄漏内存,这取决于其调用者处理内存的方式。出于这个原因,您可能更希望它返回std::shared\u ptr,或者更好的是,返回std::unique\u ptr,而不是一个普通指针。

您将结果视为一个字符串,这是很自然的想法。然而,严格地说,结果不是字符串,而是初始字符的地址。因此,sizeofresult不会做您认为的事情。尝试wcslen或wcsnlen,但实际上,您可能更喜欢学习C++风格的字符串

关于Convert1,您是对的:结果是一个本地数组,在堆栈上分配,在其函数返回时解除分配


顺便说一句,您的Convert2可能会泄漏内存,这取决于其调用者处理内存的方式。出于这个原因,您可能更愿意让它返回std::shared\u ptr或更好的std::unique\u ptr,而不是普通指针。

在第一种情况下,您返回的是堆栈上缓冲区的指针,当函数返回时,缓冲区将被销毁。在第二种情况下,您正在分配调用者必须负责的内存

试试这个:

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;
}
static std::wstring Convert1(DWORD data) 
{
  const size_t bufferSize = 10;
  wchar_t result[bufferSize];
  swprintf(result, bufferSize, L"%d", data);
  return result;
}

或对于一个更为C++的……:< /P>

static std::wstring Convert1(DWORD data) 
{
  std::wostringstream stream;
  stream << data;
  return stream.c_str();
}

在第一种情况下,返回堆栈上缓冲区的指针,当函数返回时,缓冲区将被销毁。在第二种情况下,您正在分配调用者必须负责的内存

试试这个:

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;
}
static std::wstring Convert1(DWORD data) 
{
  const size_t bufferSize = 10;
  wchar_t result[bufferSize];
  swprintf(result, bufferSize, L"%d", data);
  return result;
}

或对于一个更为C++的……:< /P>

static std::wstring Convert1(DWORD data) 
{
  std::wostringstream stream;
  stream << data;
  return stream.c_str();
}

我知道,但这是最初的问题。这是我没有触摸它的唯一原因。我更喜欢使用我自己,完成后只需拉出.str,按值返回std::wstring。您应该触摸它以给出正确的答案。编辑:哦,我知道了。@WhozCraig-请随意提供包含问题解决方案的您自己的答案:简而言之,原始指针不应该拥有内存。这根本没有理由。此外,由于缓冲区大小固定,此代码容易溢出。10对于DWORD中的所有值来说都不够大–它适合于无空终止。但另外,当数据类型从DWORD更改为其他类型时会发生什么情况?这不是个好主意。当然,你要防止
溢出,但你们会得到一个错误的结果,这不是更好的。我知道,但这是最初的问题。这是我没有触摸它的唯一原因。我更喜欢使用我自己,完成后只需拉出.str,按值返回std::wstring。您应该触摸它以给出正确的答案。编辑:哦,我知道了。@WhozCraig-请随意提供包含问题解决方案的您自己的答案:简而言之,原始指针不应该拥有内存。这根本没有理由。此外,由于缓冲区大小固定,此代码容易溢出。10对于DWORD中的所有值来说都不够大–它适合于无空终止。但另外,当数据类型从DWORD更改为其他类型时会发生什么情况?这不是个好主意。当然,你要防止溢出,但是你会得到一个错误的结果,这不是更好的。你只得到一个数字,因为它只是指向堆的指针,没有顺序数组的语法糖,所以sizeofresult==sizeofwchar\u t*意味着在大多数机器上只有顺序指针4或8个字节,sizeof*result==sizeofwchar\u t 2或4个字节,所以sizeofresult/sizeof*result!=数组的大小(以wchar\u t表示)。函数返回时,函数中的所有局部变量都将消失。局部变量通常是通过在堆栈上分配空间来实现的,当函数返回时,它会弹出所有本地分配的堆栈变量。考虑这一点的另一种方法是认识到局部变量只有在其父函数或语句块处于活动状态时才存在。您只会得到一个数字,因为结果只是指向堆的指针,而不是顺序数组,所以sizeofresult==sizeofwchar_t*在大多数机器上只表示顺序指针4或8个字节,sizeof*result==sizeofwchar\u t 2或4个字节,因此sizeofresult/sizeof*result!=数组的大小(以wchar\u t表示)。函数返回时,函数中的所有局部变量都将消失。局部变量通常是通过在堆栈上分配空间来实现的,当函数返回时,它会弹出所有本地分配的堆栈变量。考虑这一点的另一种方法是认识到局部变量只有在其父函数或语句块处于活动状态时才存在。或者,您可以在调用Convert1的函数中分配字符串/缓冲区空间,并将其作为调用中的另一个参数传递。或者,您可以在调用Convert1的函数中分配字符串/缓冲区空间,并将其作为调用中的另一个参数传递。