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

简介:

《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     mallocsizeof (struct mumble) +strlen(string) +1);

 

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

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

转载请注明:旅途@KryptosX » 关于C语言struct的特殊扩展技巧

目录
相关文章
|
3月前
|
编译器 Linux C语言
python C语言扩展之简单扩展-使用ctypes访问C代码
python C语言扩展之简单扩展-使用ctypes访问C代码
18 0
|
6月前
|
存储 编译器 C语言
C语言进阶教程(再论struct,union,enum)
C语言进阶教程(再论struct,union,enum)
39 0
|
2月前
|
算法 搜索推荐 程序员
C语言第三十三练—— KMP算法和扩展 KMP算法
C语言第三十三练—— KMP算法和扩展 KMP算法
33 0
|
2月前
|
算法 搜索推荐 程序员
C语言第二十二练——扩展欧几里得算法
C语言第二十二练——扩展欧几里得算法
25 0
|
4月前
|
SQL 关系型数据库 C语言
PostgreSQL【应用 03】Docker部署的PostgreSQL扩展SQL之C语言函数(编写、编译、载入)计算向量余弦距离实例分享
PostgreSQL【应用 03】Docker部署的PostgreSQL扩展SQL之C语言函数(编写、编译、载入)计算向量余弦距离实例分享
45 0
|
4月前
|
SQL 关系型数据库 数据库
PostgreSQL【应用 02】扩展SQL之C语言函数(编写、编译、载入)实例分享
PostgreSQL【应用 02】扩展SQL之C语言函数(编写、编译、载入)实例分享
47 0
|
4月前
|
SQL 关系型数据库 编译器
PostgreSQL SQL扩展 ---- C语言函数(二)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
65 0
|
4月前
|
SQL 存储 关系型数据库
PostgreSQL SQL扩展 ---- C语言函数(一)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
43 0
|
4月前
|
编译器 C语言
C语言中结构体(struct)的详细分解与使用(下)
C语言中结构体(struct)的详细分解与使用(下)
33 0
C语言中结构体(struct)的详细分解与使用(下)
|
15天前
|
存储 算法 编译器
C语言中结构体(struct)的详细分解与使用(中)
C语言中结构体(struct)的详细分解与使用(中)
56 0