关于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的特殊扩展技巧

目录
相关文章
|
5月前
|
编译器 Linux C语言
python C语言扩展之简单扩展-使用ctypes访问C代码
python C语言扩展之简单扩展-使用ctypes访问C代码
49 0
|
12天前
|
编译器 C语言
初识C语言:扩展世界观,选择语句之行
初识C语言:扩展世界观,选择语句之行
|
1月前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
3月前
|
移动开发 C语言
C语言13-----输出常量的两个小扩展
C语言13-----输出常量的两个小扩展
|
3月前
|
前端开发 C语言
C语言08----注释扩展知识点,注释快捷键:ctrl+k,ctrl + C,取消快捷键 ctrl + K,ctrl + U
C语言08----注释扩展知识点,注释快捷键:ctrl+k,ctrl + C,取消快捷键 ctrl + K,ctrl + U
|
5月前
|
存储 C语言
C语言结构体—自定义类型—struct
C语言结构体—自定义类型—struct
43 0
|
5月前
|
C语言 iOS开发 MacOS
Objective-C是一种面向对象的编程语言,它扩展了C语言,添加了面向对象编程的特性
【5月更文挑战第9天】Objective-C是苹果公司的面向对象编程语言,用于iOS和macOS应用开发。它扩展了C语言,包含类定义(接口和实现)、对象创建、消息传递、属性、协议、块和类别等语法特性。例如,类通过`@interface`和`@implementation`定义,对象用`alloc`和`init`创建,方法通过消息传递调用。属性简化变量声明,协议定义可选方法集合,块支持代码块作为参数,类别用于扩展已有类。错误处理常使用NSError对象。要深入了解,建议查阅相关教程和文档。
53 0
|
存储 编译器 C语言
C语言进阶教程(再论struct,union,enum)
C语言进阶教程(再论struct,union,enum)
76 0
|
5月前
|
算法 搜索推荐 程序员
C语言第三十三练—— KMP算法和扩展 KMP算法
C语言第三十三练—— KMP算法和扩展 KMP算法
64 0
|
5月前
|
算法 搜索推荐 程序员
C语言第二十二练——扩展欧几里得算法
C语言第二十二练——扩展欧几里得算法
59 0