通信人家园

 找回密码
 注册

只需一步,快速开始

短信验证,便捷登录

搜索

军衔等级:

  大校

注册:2007-4-24
跳转到指定楼层
1#
发表于 2009-12-18 11:44:06 |只看该作者 |倒序浏览
在一些 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] 的零长数组,表示该结构不定长,可通过数组的方式进行扩展。结构中必包含一个长度信息。结构本身类似于一个信息头。同时,此结构只能通过堆方式分配内存

举报本楼

本帖有 2 个回帖,您需要登录后才能浏览 登录 | 注册
您需要登录后才可以回帖 登录 | 注册 |

手机版|C114 ( 沪ICP备12002291号-1 )|联系我们 |网站地图  

GMT+8, 2024-11-16 06:31 , Processed in 0.153553 second(s), 15 queries , Gzip On.

Copyright © 1999-2023 C114 All Rights Reserved

Discuz Licensed

回顶部