我想知道对于其中一个字段的具有可变长度数组的结构,最佳解决方案是什么。我做了很多研究,但我还没有看到明确的答案。 我一直在玩下面的代码并试图将varField设置为一个10字节大小的数组。
typedef struct TestStruct{
int size;
unsigned char varField[1];
}
我尝试过零大小的数组,这给了我一个编译错误。 我也试过这样的东西,它给了我一个编译错误。
int size= 10;
struct TestStruct*test = malloc(sizeof(struct TestStruct) + (size- 1));
test->size= size;
非常感谢您的帮助。
答案 0 :(得分:2)
首选方法是使用动态可调整大小的std::vector
。这个类内置了五个规则。
struct TestStruct {
std::vector<unsigned char> varField;
}
如果您对标准库过敏,可以使用:
unsigned char *varfield;
并提供必要的构造函数/析构函数。
答案 1 :(得分:1)
如果要实现消息,更好的解决方案是设置层次结构:
struct Message_Base
{
unsigned int message_length_in_bytes;
unsigned int message_id;
virtual Checksum_Type calculate_checksum(void) = 0;
virtual bool send_message(Receiver& r) = 0;
virtual bool receive_message(Sender& s) = 0;
virtual void process_message(void) = 0;
};
每个子类都是不同的消息,可能有不同的长度。列出了所有消息的一些可能的常用方法。
这是如何使用面向对象和C ++实现的。
C类语言实现是在末尾为消息的唯一数据声明一个零长度数组。
答案 2 :(得分:0)
您似乎想要std::vector<unsigned char>
:
struct TestStruct{
std::vector<unsigned char> varField;
}
你得到的尺寸为:
ts.varField.size();
答案 3 :(得分:0)
你做不到。在C ++中,动态大小的数组是非法的。数组的大小必须是编译时常量表达式。
您拥有的选项基本上是
答案 4 :(得分:0)
在大多数编译器中,以下内容都有效:
template<unsigned N>
struct TestStruct {
unsigned size = N;
unsigned char varField[N];
};
struct ITestStruct {
unsigned size;
unsigned char varField[1]; // variable
};
template<unsigned N>
ITestStruct* make_test_struct() {
return reinterpret_cast<ITestStruct*>(new TestStruct<N>());
};
ITestStruct* make_test_struct( unsigned n ) {
char* buff = new char[ sizeof(ITestStruct)+n-1 ];
ITestStruct* retval = reinterpret_cast<ITestStruct*>(buff);
retval->size = n;
return retval;
}
如果用另一种非POD类型替换char
,事情会变得毛茸茸。