c ++结构中的可变长度数组

时间:2014-06-17 15:32:40

标签: c++

我想知道对于其中一个字段的具有可变长度数组的结构,最佳解决方案是什么。我做了很多研究,但我还没有看到明确的答案。 我一直在玩下面的代码并试图将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;

非常感谢您的帮助。

5 个答案:

答案 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 ++中,动态大小的数组是非法的。数组的大小必须是编译时常量表达式。

您拥有的选项基本上是

  1. 使用STD容器,如std :: vector等。好处是他们还会为您处理内存分配和释放。
  2. 在结构中使用指针并动态分配内存。不要忘记使用delete []而不仅仅是删除!

答案 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,事情会变得毛茸茸。

相关问题