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

  • A+
所属分类:编程开发

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

//比如:
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等库实现可变数组。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: