0

N バイトの長さのバッファーがあります。ここで、N は少なくとも 50 です。このバッファーは非常に特殊な形式であり、最初の 4 バイトはバッファーの長さ (これらの 4 バイトを含む) を表す unsigned int です。次の 16 バイトは、異なる意味を持つ 4 つの unsigned int です。次の N-20 バイトは、メモリの汎用バッファです。

現在、このバッファを設定するには、次のようにします。

memcpy((char*)my_buf + 0, &buf_size, 4);    //buf_size is some unsigned int
memcpy((char*)my_buf + 4, &prop0, 4);    //buf_size is some unsigned int
memcpy((char*)my_buf + 8, &prop1, 4);    //buf_size is some unsigned int
memcpy((char*)my_buf + 12, &prop2, 4);    //buf_size is some unsigned int
memcpy((char*)my_buf + 16, &prop3, 4);    //buf_size is some unsigned int
//Many more bytes used as a generic buffer

しかし、これは非常に洗練されていないようです。この時点で、初期アドレスが与えられたときに特定の値を特定のメモリ オフセットに割り当てるより洗練された方法があるかどうか、コミュニティに尋ねたいと思います。

私は構造体を使用することを考えましたが、IIRC 構造体はそのメンバーがメモリに配置される順序を保証しません。構造体が一般的なメモリ空間であるバッファの末尾をどのように表現できるかわかりません。

4

3 に答える 3

1

構造体は、そのメンバーがメモリに配置される順序を保証しません

それは間違っています。注文は保証されます。最終的に、コンパイラはパディングを導入できます。ただし、4 バイトの倍数で作業しているため、パディングは発生しないはずです (少なくとも 32 ビット アーキテクチャでは、何ですか?)。

このスレッドC、特に両方とC++標準への引用を見てください。

于 2012-10-31T21:16:42.523 に答える
1

少なくともsizeof(unsigned int)4 または 4 の倍数の代わりに使用する必要があります。

memcpy((char*)my_buf + 0, &buf_size, sizeof(unsigned int));
memcpy((char*)my_buf + 1 * sizeof(unsigned int), &prop0, sizeof(unsigned int));
memcpy((char*)my_buf + 2 * sizeof(unsigned int), &prop1, sizeof(unsigned int));
memcpy((char*)my_buf + 3 * sizeof(unsigned int), &prop2, sizeof(unsigned int));
memcpy((char*)my_buf + 4 * sizeof(unsigned int), &prop3, sizeof(unsigned int));

メモリが の倍数で構成されている場合はunsigned int、unsigned int の配列を使用することもできます。

unsigned int my_buf[X];

my_buf[0] = buf_size; // better yet, use sizeof(my_buf)!
my_buf[1] = prop0;
my_buf[2] = prop1;
my_buf[3] = prop2;
my_buf[4] = prop3;

または、他の人がすでに指摘したように構造体を使用します。

于 2012-10-31T21:23:30.553 に答える
0

構造体を作成し、あなたが言うようにメモリが配置されていることを信頼してください。

構造体の最後のフィールドは

struct MyStruct {

   // your fields above here...
   char generic[];
};

構造体インスタンスを作成するときは、汎用メモリのサイズを知る必要があります。

MyStruct* instance = malloc(sizeof(MyStruct) + genericBytes);

ジェネリック部分にアクセスするには、ジェネリック フィールドを使用します。

instance->generic[i] = something;

@Heisenbug は正しいですが、パディングが問題になる場合は、構造体定義の前後に pad プラグマを使用してください。

#pragma pad(1)
// ... your struct
#pragma pad()
于 2012-10-31T21:19:16.610 に答える