对于一个结构体,头部信息固定,成员节点变长的,可以采用下面的定义方式:
1. 数组
typdef struct _stHeadInfo /*头部*/
{
int version;
int magic_num;
int req_count;
int res_count;
char cgiinfo[0];
} stHeadInfo __attribute__((__aligned__(4)));
typedef struct _stCgiInfo /*成员节点*/
{
int id;
int req_count;
int res_count;
int succ_num;
int fail_num;
char path[64];
} stCgiInfo __attribute__((__aligned__(4)));
这样,在初始化头信息时,可以动态分配stCgiInfo数组的大小,并把cgiinfo指向数组的头,如下所示:
#define CGINUM 100
stHeadInfo *pHeadInfo = (stHeadInfo *)malloc(sizeof(stHeadInfo) + CGINUM * sizeof(stCgiInfo));
stCgiInfo *CgiInfo = (stCgiInfo *)stHeadInfo->cgiinfo;
这样,通过下标就可以直接访问cginfo数组了,如
for (int i = 0;i < CGINUM; i++)
{
CgiInfo[id] = i;
}
此外,sizeof(stHeadInfo)的结果是不包括char cgiinfo[0

本文介绍了处理结构体中变长成员的两种方法:1. 使用数组,通过动态分配内存并利用成员指针访问;2. 利用STL容器如vector。对比了两者的优缺点,前者适用于mmap文件和网络传输,但需要手动管理内存,后者使用简便但不适合网络传输和文件大小预估。
最低0.47元/天 解锁文章
2430

被折叠的 条评论
为什么被折叠?



