2014-06-17 54 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類語言的實現是在消息的唯一數據末尾聲明一個長度爲零的數組。