从为字符串分配内存的 C 函数返回 wchar_t*

问题描述 投票:0回答:1

为 wchar_t* 参数分配内存并将字符串复制到缓冲区后,从函数返回时无法读取缓冲区。根据调试器:

machineName 0xcccccccccccccccc <Error reading characters of string.>    wchar_t *

给出以下代码

wchar_t *machineName;
EXPECT_TRUE(c_GetMachineName(machineName));

文件test.cpp ...

#include "sysCertStore.h"
TEST(sysCertStoreC, c_GetMachineName)
{
    wchar_t *machineName;
    EXPECT_TRUE(c_GetMachineName(machineName));
    setlocale(LC_ALL, "");
    printf("%ls", machineName);
    free(machineName);
}

文件 sysCertStore.h ...

#ifdef __cplusplus
    extern "C" 
    {  
        // only need to export C interface if
        // used by C++ source code
    BOOL c_GetMachineName(wchar_t* machineName);
    };
#endif

文件sysCertStore.cpp ...

BOOL c_GetMachineName(wchar_t* machineName) {
  wchar_t Name[MAX_COMPUTERNAME_LENGTH + 1];
  int i = 0;


  LPWSTR infoBuf = new wchar_t[MAX_COMPUTERNAME_LENGTH + 1];  // = {'\0'};
  DWORD bufCharCount = MAX_COMPUTERNAME_LENGTH + 1;
  memset(Name, 0, MAX_COMPUTERNAME_LENGTH + 1);
  if (GetComputerNameW(infoBuf, &bufCharCount)) 
  {
    for (i = 0; i < MAX_COMPUTERNAME_LENGTH + 1; i++) 
    {
      Name[i] = infoBuf[i];
    }
    delete[] infoBuf;
    INT strln= wcslen(Name)+1;
    machineName = (wchar_t*)malloc(strln * sizeof(wchar_t));  // new wchar_t[strln];
    wcscpy_s(machineName, strln, Name);
    return TRUE;
  } else 
  {
    wcscpy_s(Name,7+1, L"Unknown");
    return FALSE;
  }
  return FALSE;
 }

我期望测试打印机器名称并释放在 c_GetMachineName 函数中分配的已分配字符串/缓冲区的内存。

TEST(sysCertStoreC, c_GetMachineName)
{
    wchar_t *machineName;
    EXPECT_TRUE(c_GetMachineName(machineName));
    setlocale(LC_ALL, "");
    printf("%ls", machineName);
    free(machineName);
}
c++ c pointers visual-c++ wchar-t
1个回答
0
投票

machineName
c_GetMachineName()
参数是按值传入的,因此调用者的变量被复制而不被
c_GetMachineName()
修改。

在测试中声明的本地

machineName
变量是 未初始化 并且
c_GetMachineName()
无法将其更改为指向有效地址。这就是为什么测试在尝试从无效地址读取时崩溃
0xcccccccccccccccc

要做你正在尝试的事情

c_GetMachineName()
需要通过指针接受调用者的变量,以便它可以修改变量指向的位置,例如:

#include "sysCertStore.h"
TEST(sysCertStoreC, c_GetMachineName)
{
    wchar_t *machineName;
    EXPECT_TRUE(c_GetMachineName(&machineName));
    setlocale(LC_ALL, "");
    printf("%ls", machineName);
    free(machineName);
}
BOOL c_GetMachineName(wchar_t** machineName) {

  if (!machineName)
    return FALSE;

  wchar_t Name[MAX_COMPUTERNAME_LENGTH + 1] = {};
  DWORD bufCharCount = MAX_COMPUTERNAME_LENGTH + 1;

  if (!GetComputerNameW(Name, &bufCharCount))
    return FALSE;

  int len = wcslen(Name) + 1;
  *machineName = (wchar_t*) malloc(len * sizeof(wchar_t));  // new wchar_t[len];
  if (!*machineName)
    return FALSE;

  wcscpy_s(*machineName, len, Name);
  return TRUE;
}
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.