通信人家园
标题:
结构体零长度数组的作用
[查看完整版帖子]
[打印本页]
时间:
2009-12-18 11:44
作者:
alrn
标题:
结构体零长度数组的作用
在一些 C 语言编写的代码中,有时可以看到如下定义的结构:
BSD爱好者乐园I.C"YxC;LR.O
typedef 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] 的零长数组,表示该结构不定长,可通过数组的方式进行扩展。结构中必包含一个长度信息。结构本身类似于一个信息头。同时,此结构只能通过堆方式分配
内存
。
时间:
2009-12-23 13:25
作者:
cj578009030
咋有乱码呀?
时间:
2009-12-24 19:20
作者:
wanchao2200
啥玩意啊???
通信人家园 (https://www.txrjy.com/)
Powered by C114