2014-06-17 53 views
-3

我想知道最好的解决方案是哪一个字段的变长数组结构。我做了大量的研究,但我还没有看到明确的答案。 我一直在玩下面的代码,并试图让varField被设置为一个10字节大小的数组。C++结构中的可变长度数组

typedef struct TestStruct{ 
    int size; 
    unsigned char varField[1]; 
} 

我试过做零大小的数组,并给我一个编译错误。 我也试过这样的事情,它给了我一个编译错误。

int size= 10; 
struct TestStruct*test = malloc(sizeof(struct TestStruct) + (size- 1)); 
test->size= size; 

非常感谢您的帮助。

+3

是否有一些令人信服的理由不使用标准容器? – shuttle87

+3

“'malloc'”让我感到畏缩。 –

+1

如果这是C99,请使用[this method](http://stackoverflow.com/a/20221073),而不是C++的扩展部分(http://stackoverflow.com/a/22608418/1708801)/1708801)。 –

回答

0

你看起来像你想std::vector<unsigned char>

struct TestStruct{ 
    std::vector<unsigned char> varField; 
} 

,你会得到大小搭配:

ts.varField.size(); 
+0

我不能为此使用矢量,因为我需要将它转换为消息的字节数组。 – user3470688

+2

@ user3470688您正试图解决错误的问题。这里要解决的正确问题是使用除未格式化的字节流以外的其他信息进行消息传递。有更好的解决方案。 Google今天发布了一个新的。 –

+2

不是问题,使用'vector'的'data()'成员来获得该字节数组 –

2

的首选方法是使用动态可扩展std::vector。这个类有五个内建的规则

struct TestStruct { 
    std::vector<unsigned char> varField; 
} 

如果你的标准库过敏,你可以使用:

unsigned char *varfield; 

,并提供必要的构造函数/析构函数。

0

你不行。在C++中,动态大小数组是非法的。数组的大小必须是编译时常量表达式。

你的选项基本上都是

  1. 使用类似的std ::载体等STL容器。好处是它们也为您处理内存分配和重新分配。
  2. 在你的结构中使用一个指针并动态地为它分配内存。不要忘记使用delete []而不是仅仅删除!
+0

关注downvote? – sigy

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

如果您要更换char与其他非POD类型,事情会变得毛。

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类语言的实现是在消息的唯一数据末尾声明一个长度为零的数组。