《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等库实现可变数组。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
广告
暂无评论内容