《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等库实现可变数组。