- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
结构中的零长度数组
结构中的零长度数组
Sunny.man
有时候我们会碰到下面这样的结构体,这其中有一个结构长度为零的数组。这个结构有什么作用呢?这样定义是否合法?是否占用存储空间呢?下面我们依次解决这些问题。
Struct Rep
{
Int size,capacity;
Char str[0];
}
这个结构中str不占用存储空间,仅是一个符号。它在标准C中是不合法的,合法的定义应该是
Struct Rep
{
Int size,capacity;
Char str[];//这样定义
}
这样进行定义也同样不占用存储空间,它也仅仅是一个符号。
下面的短文将解释这样用的好处和便利性。
如上图所示如果我们定义为
Stcuct Rep
{
Int size,capacity;
Char *str;
};
我们在使用的时候,必须这样用
Rep *prep=new Rep;
If(prep)
{
Char *tempbuf=new char[N];
If(tempbuf)
{
Prep-str=tempbuf;//需要初始化,并且附值。Buf的存储空间和结构体的存储空间也不是连续的,会出空内存碎片.
}
Else//如果buf分配不成功,需要删除结构体的空间。
{
}
}
通过上面的应用我们知道了最少两个原因使用这个特性:1.由于结构体和缓存不是一同分配在内存管理上复杂。2.需要初始化,那里面的内存指针。
如果我们使用了结构体内的零长度数组,我们在使用的时候,就可以这样使用.
Rep *rep= reinterpret_castRep *(new int[4]);
Rep- size=12;
Rep-capacity=8;
Memcpy(Rep-str,”Device”,6);
Rep-str[6]=’\0’;
这样做的好处是不仅避免了小内存碎片(结构体)而且可以把给指针分配的内存紧邻在结构体的后面,并且指针不需要被初始化,自然就被附值了。其内存中的结构如下图所示.
文档评论(0)