3

私はいくつかの調査を行いましたが、明確な承認または不承認を見つけることができません.

私が欲しいのは、固定サイズの構造と可変長の部分で、シリアライゼーションをシンプルでエラーの少ない方法で表現できるようにすることです。

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

その後:

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

残念ながら、MSVC、GCC、CLang などが問題ないかどうかはわかりません。

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

私は本当にこれらの醜いキャストをあちこちに望んでいません:

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

1 に答える 1

2

このプログラムは長さゼロの配列を使用しています。これは C ではなく、GNU 拡張です。

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

struct hackと呼ばれる C89 の一般的なイディオムは、次を使用することでした。

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

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

C99 には、同じタスクを実行するための同様の機能が付属しています:フレキシブル アレイ メンバーと呼ばれる機能です。これは、標準 (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]));
于 2012-04-04T21:50:29.423 に答える