我需要制作一个包含头部,尾部和可变长度有效载荷字段的数据包。到目前为止,我一直在使用向量作为有效负载,所以我的结构设置如下:
struct a_struct{
hdr a_hdr;
vector<unsigned int> a_vector;
tr a_tr;
};
当我尝试访问向量的成员时,我得到一个seg错误,整个结构的sizeof给我32(在我向向量添加了大约100个元素之后。
这是一个好方法吗?什么更好?
我找到了这篇文章 Variable Sized Struct C++ 他正在使用char数组,但我正在使用矢量。
答案 0 :(得分:5)
尽管向量类型在结构中内联,但向量中唯一的成员可能是指针。向向量添加成员不会增加向量类型本身的大小,而是增加它指向的内存。这就是为什么你永远不会看到结构的大小增加内存,因此你得到一个seg错误。
通常当人们想要创建一个可变大小的结构时,他们通过添加一个数组作为结构的最后一个成员并将其长度设置为1来实现。然后,他们将为sizeof实际需要的结构分配额外的内存。 ()以“扩展”结构。这几乎总是伴随着结构中的额外成员,详细说明了扩展数组的大小。
在Raymond的博客中详细记录了使用1的原因
答案 1 :(得分:2)
其他SO答案中的解决方案是c特定的,并且依赖于c数组的特性 - 即使在c中,sizeof()也无法帮助您找到可变大小结构的“真实”大小。从本质上讲,它是作弊,这是一种在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
答案 2 :(得分: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; } // };
这可能与问题完全无关,但我想分享信息