- 经验
- 4191
- 分贝
- 0
- 家园分
- 15963
- 在线时间:
- 480 小时
- 最后登录:
- 2024-4-25
- 帖子:
- 1108
- 精华:
- 0
- 注册时间:
- 2007-4-24
- UID:
- 157502
注册:2007-4-24
|
在一些 C 语言编写的代码中,有时可以看到如下定义的结构:BSD爱好者乐园I.C"YxC;LR.Otypedef struct user_defBSD爱好者乐园;m+f_ B Y"ms1G.D$k
{
0ZtA0C}Y'R char * name;
1zp%D.|%so4qg;h1Vol int length;BSD爱好者乐园BWc{w iM ~H
char bytes[0];BSD爱好者乐园'u~nq T9}l [
} user_def_t;
BSD爱好者乐园8v;Q0^.H+F!g%z'i 这个 bytes 是什么意思?我们知道 0 == sizeof(bytes),那么 bytes 仅仅是为了定义结构的尾地址吗?
pH y.pq&Ez qB?lZ` W不是的。这里的 bytes 是作为扩展数组用的。请看如下代码:
)S `(q^1sW.bv int alloc_user_def_t(user_def_t * p, int length)BSD爱好者乐园_ jde^
{BSD爱好者乐园kSc I6?m;B}`
p = (user_def_t)malloc(sizeof(user_def_t) + length);BSD爱好者乐园IW_HFcL5ZT
if (NULL == p)BSD爱好者乐园 ?DV2Zs(cQ o!w
{BSD爱好者乐园.y'`X\v-sU
return -1;
(Ui_)]KlJ)s }
Ufd8fi$M]X9E4QwBSD爱好者乐园%[N0h E4s
p->name = NULL;BSD爱好者乐园Co]1wgA
p->length = length;
q {)P3q#t/T `b J"j,z O memset(p->bytes, 0, length);BSD爱好者乐园e]JRp2H2qD
return 0;BSD爱好者乐园qJiG7D0j)}l
}
BSD爱好者乐园 o;lIG#ER9Gj#I(Y 是不是很酷?同样,也可以把 name 域的值附在结构后面:
Q:t x7XO0s8w int alloc_user_def_t(user_def_t * p, char * name, int length)
bm Tqe|{
Zn?Z!| t:PM j p = (user_def_t)malloc(sizeof(user_def_t) + strlen(name) + length + 1);BSD爱好者乐园|}4E+fLl(O;q
if (NULL == p)BSD爱好者乐园q!X\0g'V9h.?9B
{
K;i~[YJ F return -1;BSD爱好者乐园L+lh;X*h7\'_*j
}
p->name = p + sizeof(user_def_t) + length;BSD爱好者乐园0z c ^'VG3Hy w
memcpy(p->name, name, strlen(name) + 1); /* 别忘了'\0' */BSD爱好者乐园2tD"D|&G!K+C
p->length = length;BSD爱好者乐园B,H5sf}
memset(p->bytes, 0, length);
#M,o0R _5Es9q return 0;BSD爱好者乐园 E4_x$Q|'R+W!~F
}
;R'g lB9N总结:在某一结构末尾如定义类似 char bytes[0] 的零长数组,表示该结构不定长,可通过数组的方式进行扩展。结构中必包含一个长度信息。结构本身类似于一个信息头。同时,此结构只能通过堆方式分配内存。
|
|