構造体の最後のメンバーは配列(長さゼロ)とポインタです.
1.構造体の最後の配列長がゼロ
typedef struct _ex_mng { unsigned int type; unsigned int oper; char data[0]; }ex_mng_t;
, 。
char data[0] data , , a、b , , , sizeof(struct _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
の長さ配列の原因は、主にメモリバッファの管理を容易にするためであり、ポインタを使用する場合(使用方法が一時的に)、連続したメモリを割り当てることができず、メモリの断片化が増加する.