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