結構體的擴展數組

在一些 C 語言編寫的代碼中,有時可以看到如下定義的結構:
typedef struct user_def
{
    
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
;
}
是不是很酷?同樣,也可以把 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->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;
}
總結:在某一結構末尾如定義類似 char bytes[0] 的零長數組,表示該結構不定長,可通過數組的方式進行擴展。結構中必包含一個長度信息。結構本身類似於一個信息頭。同時,此結構只能通過堆方式分配內存。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章