C++ 用于生成可变大小结构的方法

C++ 用于生成可变大小结构的方法,c++,data-structures,packets,C++,Data Structures,Packets,我需要制作一个包,它有一个头部、一个尾部和一个可变长度的有效载荷字段。到目前为止,我一直在为有效负载使用向量,因此我的结构设置如下: struct a_struct{ hdr a_hdr; vector<unsigned int> a_vector; tr a_tr; }; struct a_struct{ hdr a_hdr; 向量a_向量; tr a_tr; }; 当我尝试访问向量的成员时,我得到一个seg错误,整个结构的大小为32(在我向向量添加了大约100个元素之后

我需要制作一个包,它有一个头部、一个尾部和一个可变长度的有效载荷字段。到目前为止,我一直在为有效负载使用向量,因此我的结构设置如下:

struct a_struct{
 hdr a_hdr;
 vector<unsigned int> a_vector;
 tr a_tr;
};
struct a_struct{
hdr a_hdr;
向量a_向量;
tr a_tr;
};
当我尝试访问向量的成员时,我得到一个seg错误,整个结构的大小为32(在我向向量添加了大约100个元素之后)

这是一个好方法吗?什么更好

我找到了这个帖子
他使用的是字符数组,而我使用的是向量。

即使向量类型在结构中是内联的,向量中唯一的成员可能是指针。向向量添加成员不会增加向量类型本身的大小,但会增加它指向的内存。这就是为什么你永远看不到结构增量的大小容易记忆,因此你得到一个seg故障

通常,当人们想要创建一个可变大小的结构时,他们会添加一个数组作为结构的最后一个成员,并将其长度设置为1。然后,他们会为sizeof()实际需要的结构分配额外内存,以便“扩展”结构。这几乎总是伴随着结构中的一个额外成员,详细说明扩展数组的大小

使用1的原因在Raymond的博客上有详细的记录


另一个SO答案的答案是C特定的,并且依赖C数组的特性——甚至在C、siZOFF()中,它也不能帮助你找到一个可变大小结构的“真”大小。本质上,它是欺骗,它是一种在C++中不需要的欺骗。

您所做的很好。为了避免seg故障,请像访问C++中的任何其他向量一样访问该向量:

a_struct a;
for(int i = 0; i < 100; ++i) a.a_vector.push_back(i);
cout << a.a_vector[22] << endl; // Prints 22
a_结构a;
对于(int i=0;i<100;++i)a.a_向量,向后推(i);

cout我在boost中看到了这个实现。它看起来非常整洁…有一个变量 长度有效载荷


这可能与问题完全无关,但我想与大家分享信息

能否请您提供更多的代码。您如何创建和访问结构等?您应该注意,数据包的内存不是连续的,因为您使用的是vector。因此,例如,您不能用请注意,这两个声明(c-struct和hier)是不同的。
class msg_hdr_t 
{
   public:
   std::size_t             len;     // Message length
   unsigned int            priority;// Message priority
   //!Returns the data buffer associated with this this message
   void * data(){ return this+1; }  //
};