变长结构体,其实真正意义上并不是结构体的大小可变,而是使用结构体中的变量代表一个地址,从而访问超出结构体大小范围的数据
如下两个结构体:
using node = struct node
{
int a;
int b;
}
using nodes = struct nodes
{
int nodeNums;
node *array[2];
}
现在创建5个node结构体变量
std::vector<node> allNode;
for(int i=0;i<5;++i)
allNode.append(new node);
首先计算nodes结构体加上这5个结构体指针的长度
decltype{allNode.size()} length=sizeof(nodes)+sizeof(node *)*allNode.size();
创建此长度的缓冲区
std::vector<char> buffer;
buffer.resize(length);
将此字符数组强制转换为nodes结构体
nodes *n=reinterpret_cast<node *>(buffer.data());
此时就可以为结构体的变量赋值了
n->nodeNums=5;
for(int i=0;i<n->nodeNums;++i)
n->array[i]=reinterpret_cast<node *>(&allNode[i]);