0

我需要制作一个包含标头、尾标和可变长度有效负载字段的数据包。到目前为止,我一直在使用向量作为有效载荷,所以我的结构是这样设置的:

struct a_struct{
 hdr a_hdr;
 vector<unsigned int> a_vector;
 tr a_tr;
};

当我尝试访问向量的成员时,我得到一个段错误,整个结构的 sizeof 给了我 32(在我向向量添加了大约 100 个元素之后。

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

我发现这篇文章 Variable Sized Struct C++ 他使用的是 char 数组,而我使用的是向量。

4

3 回答 3

5

即使向量类型在结构中内联,向量中的唯一成员也可能是指针。向向量添加成员不会增加向量类型本身的大小,而是增加它指向的内存。这就是为什么您永远不会看到内存中结构的大小增加,因此您会遇到段错误。

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

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

于 2009-06-19T13:42:16.290 回答
2

另一个 SO 答案中的解决方案是 c 特定的,并且依赖于 c 数组的特性 - 即使在 c 中, sizeof() 也不会帮助您找到可变大小结构的“真实”大小。本质上,它是作弊,这是一种在 C++ 中没有必要的作弊。

你在做什么很好。为避免段错误,请像访问 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
于 2009-06-19T13:50:21.483 回答
1

我在 boost 中看到了这个实现..它看起来真的很整洁......有一个可变长度的有效载荷......

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; }  //
};

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

于 2009-06-19T17:46:36.427 回答