目录
1.前言
结构体是C、C++开发中不可或缺的数据结构,往往涉及到函数的入参以及出参等,也必然涉及到参数的初始化。对于字符串往往是需要在堆上开辟一定空间的,本篇文章记录下相关知识!
2.常见结构类型
typedef wchar_t MY_WCHAR;
typedef char MY_CHAT;
typedef wchar_t* MY_WSTR;
typedef char* MY_STR;
typedef long long MY_INT64;
typedef unsigned int MY_INT32;
typedef struct TagBasicInfoW
{
MY_WSTR TagName; //变量名称
MY_INT64 TagID; //变量ID
MY_UINT32 TagDataType; //变量数据类型
}MYTAG_BASICINFOW,*PMYTAG_BASICINFOW;
typedef struct TagBasicInfo
{
MY_STR TagName; //变量名称
MY_INT64 TagID; //变量ID
MY_UINT32 TagDataType; //变量数据类型
}MYTAG_BASICINFO,*PMYTAG_BASICINFO;
typedef struct MYTagBasicInfoArray
{
WOS_UINT32 TagNum; //变量数量
PMYTAG_BASICINFO TagBasicInfoArray; //变量基本属性数组
}MYTAG_BASICINFO_ARRAY,*PMYTAG_BASICINFO_ARRAY;
typedef struct MYTagBasicInfoArrayW
{
WOS_UINT32 TagNum; //变量数量
PMYTAG_BASICINFOW TagBasicInfoArray; //变量基本属性数组
}MYTAG_BASICINFO_ARRAYW,*PMYTAG_BASICINFO_ARRAYW;
3.Demo
具体场景:TagBasicInfo作为出参,用于相关数据的读取或写入
a:char*类型(MY_STR)
MYTAG_BASICINFO_ARRAY tagInfoArr;
tagInfoArr.TagNum = 100;
//申请malloc空间
for(int i=0; i<tagInfoArr.TagNum; i++)
{
std::string mytagName = "Tag1";
tagInfoArr.TagBasicInfoArray[i].TagName = (MY_CHAR*)malloc((mytagName .length()+1) * sizeof(MY_CHAR));
memset(tagInfoArr.TagBasicInfoArray[i].TagName, 0, mytagName .length()+1);
memcpy(tagInfoArr.TagBasicInfoArray[i].TagName, mytagName.c_str(), mytagName .length());
}
//******************释放free空间Start**********************
for(int i=0; i<tagInfoArr.TagNum; i++)
{
if(tagInfoArr.TagBasicInfoArray[i].TagName!=NULL)
{
free(tagInfoArr.TagBasicInfoArray[i].TagName);
tagInfoArr.TagBasicInfoArray[i].TagName = NULL;
}
}
if (tagInfoArr.TagBasicInfoArray != NULL)
{
free(tagInfoArr.TagBasicInfoArray);
}
tagInfoArr.TagBasicInfoArray = NULL;
tagInfoArr.TagNum = 0;
//******************释放free空间End**********************
b:wchar_t*类型(MY_WSTR)
MYTAG_BASICINFO_ARRAYW tagInfoArr;
tagInfoArr.TagNum = 100;
//申请malloc空间
for(int i=0; i<tagInfoArr.TagNum; i++)
{
std::wstring mytagName = "变量1";
int dwLen = WideCharToMultiByte(CP_ACP, 0, mytagName, wcslen(mytagName), 0, 0, 0, 0);
tagInfoArr.TagBasicInfoArray[i].TagName = (MY_WCHAR*)malloc((dwLen +1) * sizeof(MY_WCHAR));
wmemset(tagInfoArr.TagBasicInfoArray[i].TagName, 0, dwLen +1);
wmemcpy(tagInfoArr.TagBasicInfoArray[i].TagName, mytagName.c_str(), dwLen);
}
//******************释放free空间Start**********************
for(int i=0; i<tagInfoArr.TagNum; i++)
{
if(tagInfoArr.TagBasicInfoArray[i].TagName!=NULL)
{
free(tagInfoArr.TagBasicInfoArray[i].TagName);
tagInfoArr.TagBasicInfoArray[i].TagName = NULL;
}
}
if (tagInfoArr.TagBasicInfoArray != NULL)
{
free(tagInfoArr.TagBasicInfoArray);
}
tagInfoArr.TagBasicInfoArray = NULL;
tagInfoArr.TagNum = 0;
//******************释放free空间End**********************
4.结束
再见!