2012-04-04 11 views
3

私はいくつかの研究を行いましたが、明確な承認または不承認を見つけることはできません。直列化は簡単で、エラーが発生しにくい方法で表現することができるように、私が欲しいもの可変長データとゼロ長配列のバイナリシリアル化は安全ですか?

は、固定サイズの構造+可変長部分です。

struct serialized_data 
{ 
    int len; 
    int type; 
    char variable_length_text[0]; 
}; 

そして:MSVC、GCC、打ち鳴らすなどあれば

serialize_data buff = (serialize_data*)malloc(sizeof(serialize_data)+5); 
buff->len=5; 
buff->type=1; 
memcpy(buff->variable_length_text, "abcd", 5); 

残念ながら私は見つけることができない、それにOKです。

たぶん同じことを達成するためのより良い方法はありますか?

は、私は本当にすべての周りの人々の醜いキャストをしたくない:このプログラムは、長さ0の配列を使用している

memcpy((char*)(((char*)buffer)+sizeof(serialize_data)), "abcd", 5); 
+1

の一例です。 – ildjarn

+4

言語を選択してください。 C++やCに興味がありますか? –

+1

おそらくこの記事が役に立ちます。可搬性の質問に答えていないが、このパターンhttp://blogs.msdn.com/b/oldnewthing/archive/2004/08/26/220873.aspx – JaredPar

答えて

2

。これはCではなく、GNU拡張です。

http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

C89に共通のイディオムは、が構造をハックと呼ばれる、使用していた:

struct serialized_data 
{ 
    int len; 
    int type; 
    char variable_length_text[1]; 
}; 

は残念ながら柔軟な配列としての一般的な用途は、厳密に準拠ではありません。

C99には、同じタスクを実行するのに似たものが付属しています。フレキシブルアレイメンバと呼ばれる機能です。 `が、はい、同じことを達成するためのより良い方法は、確かにあり、ここ [1]右`チャーvariable_length_textなければならない標準(C99、6.7.2.1p17)

struct s { int n; double d[]; }; 
int m = 12; // some value 
struct s *p = malloc(sizeof (struct s) + sizeof (double [m])); 
+0

C99の方法を使用して、MSVC7/8/9、GCC、Clangで動作することはできますか? – Coder

+0

C99はgccとclangではサポートされていますが、MSVCではサポートされていません。 struct hackは厳密には適合していませんが、かなり一般的で、C89コンパイラで考慮する必要があります。 – ouah

関連する問題