《Unix/Linux编程实践教程》中P69页,有写道,dirent结构中成员d_name用于存放文件名。注意在此系统中d_name被定义为只有一个元素的数组,这是如何做到的能?因为一个自负的空间只能存放字符串的结束字符。P92也询问,在struct dirent中,数组d_name[]的长度在有的系统上是1,而在有的系统上是是255。实际长度是多少?为什么会有这些不同?
对此,我也一直十分困惑,直到看到《深度探索C++对象模型》P19才终于明白。
01 |
//比如: |
02 |
struct mumble{
|
03 |
/*stuff*/
|
04 |
char pc[1];
|
05 |
} |
06 |
//是配合了下面的代码的 |
07 |
//从档案或标准输入装置中取得一个字符串 |
08 |
//然后为struct本身和该字符串配置足够内存 |
09 |
struct mumble *pmumbl = ( struct mumble*)
|
10 |
malloc ( sizeof ( struct mumble) + strlen (string) +1);
|
到这里,应该已经很清楚了,这个c语言的技巧关键在于这个数组位于struct末尾,于是配合malloc实现可变数组。事实上对于struct是越界的,只是申请内存时考虑了越界的容量。
特别注意:这种技巧只存在于C语言的struct中,如果是C++的class,特别是派生类定义了virtual functions等,可能能顺利转化,也可能不行。所以C++中应该避免这种技巧,使用STL的vector等库实现可变数组。
转载请注明:旅途@KryptosX » 关于C语言struct的特殊扩展技巧
时间: 2024-11-02 18:27:55