前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于C语言struct的特殊扩展技巧

关于C语言struct的特殊扩展技巧

作者头像
sean.liu
发布2022-08-03 14:49:50
4160
发布2022-08-03 14:49:50
举报

《Unix/Linux编程实践教程》中P69页,有写道,dirent结构中成员d_name用于存放文件名。注意在此系统中d_name被定义为只有一个元素的数组,这是如何做到的能?因为一个自负的空间只能存放字符串的结束字符。P92也询问,在struct dirent中,数组d_name[]的长度在有的系统上是1,而在有的系统上是是255。实际长度是多少?为什么会有这些不同? 对此,我也一直十分困惑,直到看到《深度探索C++对象模型》P19才终于明白。

代码语言:javascript
复制
//比如:
struct mumble{
     /*stuff*/
     char pc[1];
}
//是配合了下面的代码的
//从档案或标准输入装置中取得一个字符串
//然后为struct本身和该字符串配置足够内存
struct mumble *pmumbl = (struct mumble*)
malloc( sizeof (struct mumble) +strlen(string) +1);

到这里,应该已经很清楚了,这个c语言的技巧关键在于这个数组位于struct末尾,于是配合malloc实现可变数组。事实上对于struct是越界的,只是申请内存时考虑了越界的容量。

特别注意:这种技巧只存在于C语言的struct中,如果是C++的class,特别是派生类定义了virtual functions等,可能能顺利转化,也可能不行。所以C++中应该避免这种技巧,使用STL的vector等库实现可变数组。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014年4月16日1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档