0

簡単に言うと、割り当てられた各ブロックに関連する制御情報が含まれる (unsigned char 型の) 割り当てルーチンを作成しようとしています。本格的なメモリ マネージャーを作成しようとしているわけではありませんが、いくつかの特定の要件があります。

制御構造のサンプル

typedef struct _control_data
{
   u8 is_segment;
   :
   :
   :
   struct _control_data* next;
}control_data;

ユーザーがサイズ 40 の alloc を呼び出すと、割り当てます

  unsigned char* data_ptr = (unsigned char*)malloc(sizeof(control_data) + size);
  return(&data_ptr[sizeof(control_data]);

後で、ユーザーは割り当て中に返されたポインターを渡し、制御情報にアクセスしたいと考えています。

void do_some_processing(unsigned char* data_ptr)
   {
      struct control_data* c_ptr = (data_ptr - sizeof(control_data));
      c_ptr->is_segment = TRUE;
      c_ptr->next       = NULL;
   }

上記のアクセスは合法で移植可能ですか?

4

1 に答える 1

1

はい、それは問題ないはずであり、一般的な手法です。

いくつかのポイント:

void * my_alloc(size_t size)
{
    control_data *cd = malloc(size + sizeof *cd);
    if(cd != NULL)
      return cd + 1;
    return NULL;
}

+ 1正確に正しいことを行いますが、はるかに簡単です。また、割り当てを「型付け」しても意味がありません。返して、ポインタを使用して返された値を格納するvoid *のは呼び出し元に任せます。unsigned char *

UPDATE : コメントで指摘されているように、これはアライメントを無視します (非コントロール データは の配列であると言うので安全だと感じますunsigned char)。これは、一般的なケースでは問題になる可能性があります。

于 2013-10-07T16:58:10.473 に答える