数据结构中含有可变长度字段处理

一、前言

在实际系统中,用户知道发生了什么事件的流程可能是:底层驱动检测到事件——上抛到对应模块处理——弹窗或者其他方式让用户可见。但是事件很多种,有时候不能确认事件中某一个字段值的长度,而直接申请最大长度的话,如果很大的话比较浪费内存空间。因此可能会使用下面的方式定义事件的相关信息:

typedef struct
{
    ...
    uint64_t   reserved1;     //预留
    uint64_t   reserved2;     //预留
    uint32_t   info_size;   
    uint8_t    event_info[0];  
}REVENT_INFO,*PREVENT_INFO;

event_info字段是不定长度的。这种情况下,不管是设置值还是获取值,我们都需要申请对应大小的空间,如果

memcpy(event->event_info, pEventInfo, nLen);

除非没有其他调用使用到这块内存,否则可能发现意料之外的问题。

二、处理

鉴于以上说明,不管是设置还是获取,我们最好都先申请一块内存,用来保存事件的信息。
以下流程以设置为例进行说明。

1、申请内存空间

CString strEventInfo = Dlg.m_strEventInfo;
CStringA strData(strEventInfo);
int nLen = strData.GetLength();        //调用输入的内容长度

int nEventInfoSize = sizeof(REVENT_INFO) + nLen;
char* pEventInfo = new(std::nothrow) char[nEventInfoSize + 1];
if (NULL == pEventInfo)
{
    return ;
}

ZeroMemory(pEventInfo, nEventInfoSize + 1);

PREVENT_INFO pEvent = (PREVENT_INFO )pEventInfo;

const char* pInfo = strData.GetString();
memcpy(pEvent->event_info, pInfo, nLen);
pEvent->info_size = nLen;

...
delete[] pEvent;
pEvent = NULL;

这里为什么将CString转为CStringA呢?当用户输入的内容包含中文或者其他字符时,保证能正确设置内容;如果不转的话,字符串中含有中文等,非英文字符的情况下,可能用户设置的值和真实设置的值不一致,因为中文字符和英文字符的字节长度不一致。

因为pEvent的内存是new出来,因此在使用完了之后,最好使用delete释放掉,若不释放的话,在频繁调用情况,内存增长很快,到一定情况下,可能导致其他调用申请内存空间失败。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MySQL数据结构的特殊符号主要用于定义表字段类型和约束。常见的特殊符号包括: 1. VARCHAR:用于定义可变长度的字符串类型字段。它是一种用于存储文本数据的数据类型。 2. INT:用于定义整数类型字段。它是用于存储整数数据的数据类型。 3. FLOAT:用于定义浮点数类型字段。它是用于存储小数或科学计数法表示的数据的数据类型。 4. DATE:用于定义日期类型字段。它是用于存储日期数据的数据类型。 5. NULL:表示字段的值可以为空。 6. PRIMARY KEY:用于定义主键约束,确保表的每一行都有唯一的标识。 7. FOREIGN KEY:用于定义外键约束,用于建立不同表之间的关联。 8. UNIQUE:用于定义唯一约束,确保表的某个字段的值是唯一的。 9. NOT NULL:表示字段的值不允许为空。 这些特殊符号在定义数据表结构时起到了重要的作用,帮助我们确保数据的准确性和一致性。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [Mysql语法、特殊符号及正则表达式的使用详解](https://download.csdn.net/download/weixin_38704011/13699784)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [通过抽象语义保留转换从开源存储库获取真实世界的基准程序(计算机硕士毕业论文英文参考资料).pdf](https://download.csdn.net/download/weixin_44609920/88240781)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值