構造体の最後のメンバーは配列(長さゼロ)とポインタです.

2508 ワード

1.構造体の最後の配列長がゼロ
 
  
 
  
typedef struct _ex_mng
{
    unsigned int type;
    unsigned int oper;
    char data[0];
}ex_mng_t;
                     ,             。
    char data[0]  data     ,      ,         a、b        ,                ,             ,  sizeofstruct  _ex_mng) = 8           ,   ,malloc                     ,              ,   ,        free     。
  : 
   ex_mng_t *ex_mng;
   int datalen = 100;
   /*     (     data   )*/   
   ex_mng = (ex_mng_t *)malloc(sizeof(ex_mng_t) + datalen );   
   ex_mng->type = 1;   
   ex_mng->oper = 1;   
   strcpy(ex_mng->data, "success!");
         ,     0 ex_mng->data            ,           datalen            ,         ! 

2.構造体の最後のメンバーがポインタ
 
  
typedef struct _ex_mng
{
    unsigned int type;
    unsigned int oper;
    char *data;
}ex_mng_t;
で、ポインタであれば使用時に初期化が必要で、スペースを占有し、
sizeof
(struct _ex_mng) 
= 12
(
32
ビット)
/sizeof
(struct _ex_mng) 
= 12
(
64
位).
   ex_mng_t *ex_mng;
   int datalen = 100;
   /*     (   ) */
   ex_mng = (ex_mng_t *)malloc(sizeof(ex_mng_t));
   ex_mng->type = 1;
   ex_mng->oper = 1;
   /*     (data) */
   ex_mng->data = malloc(sizeof(char)* datalen );
   strcpy(ex_mng->data, "success!");
   /*     (data)*/
   free(ex_mng->data);
   /*     (   )*/
   free(ex_mng);

使用方法2:
   ex_mng_t *ex_mng;
   int datalen = 100;
   /*     (   +data) */
   ex_mng = (ex_mng_t *)malloc(sizeof(ex_mng_t) + sizeof(char)*datalen);
   ex_mng->type = 1;
   ex_mng->oper = 1;
   /* ex_mng->data          */
   ex_mng->data = ((char *)ex_mng ) + sizeof(ex_mng_t);
   strcpy(ex_mng->data, "success!");
   /*     (   +data)*/
   free(ex_mng);

注意:構造体の最後の配列の長さはゼロであり、一部のコンパイラはコンパイルできないとエラーを報告し、char data[1]に変更することができる.
あるいは
char data[]
. つまり、構造体は最後に
0
または
1
の長さ配列の原因は、主にメモリバッファの管理を容易にするためであり、ポインタを使用する場合(使用方法が一時的に)、連続したメモリを割り当てることができず、メモリの断片化が増加する.