在一些 C 語言編寫的代碼中,有時可以看到如下定義的結構:
typedef struct user_def
{
char * name;
int length;
char bytes[0];
} user_def_t;
{
char * name;
int length;
char bytes[0];
} user_def_t;
這個 bytes 是什麼意思?我們知道 0 ==
sizeof(bytes),那麼 bytes 僅僅是爲了定義結構的尾地址嗎?
不是的。這裏的 bytes 是作爲擴展數組用的。請看如下代碼:
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;
}
{
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 域的值附在結構後面:
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 = (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;
}
memcpy(p->name, name, strlen(name) + 1); /* 別忘了'\0' */
p->length = length;
memset(p->bytes, 0, length);
return 0;
}
總結:在某一結構末尾如定義類似 char bytes[0]
的零長數組,表示該結構不定長,可通過數組的方式進行擴展。結構中必包含一個長度信息。結構本身類似於一個信息頭。同時,此結構只能通過堆方式分配內存。