在一些 C 語言編寫的代碼中,有時可以看到如下定義的結(jié)構(gòu): typedef struct user_def
{ char * name; int length; char bytes[0]; } user_def_t; 這個 bytes 是什么意思?我們知道 0 == sizeof(bytes),那么 bytes 僅僅是為了定義結(jié)構(gòu)的尾地址嗎? 不是的。這里的 bytes 是作為擴展數(shù)組用的。請看如下代碼: int alloc_user_def_t(user_def_t * p, int length)
{ p = (user_def_t)malloc(sizeof(user_def_t) + length); if (NULL == p) { return -1; } p->name = NULL; p->length = length; memset(p->bytes, 0, length); return 0; } 是不是很酷?同樣,也可以把 name 域的值附在結(jié)構(gòu)后面: int alloc_user_def_t(user_def_t * p, char * name, int length)
{ p = (user_def_t)malloc(sizeof(user_def_t) + strlen(name) + length + 1); if (NULL == p) { return -1; } p->name = p + sizeof(user_def_t) + length;
memcpy(p->name, name, strlen(name) + 1); /* 別忘了‘\0‘ */ p->length = length; memset(p->bytes, 0, length); return 0; } 總結(jié):在某一結(jié)構(gòu)末尾如定義類似 char bytes[0] 的零長數(shù)組,表示該結(jié)構(gòu)不定長,可通過數(shù)組的方式進行擴展。結(jié)構(gòu)中必包含一個長度信息。結(jié)構(gòu)本身類似于一個信息頭。同時,此結(jié)構(gòu)只能通過堆方式分配內(nèi)存。 |
|