当前位置:网站首页>柔性数组到底如何使用呢?
柔性数组到底如何使用呢?
2022-07-06 14:40:00 【是北豼不太皮吖】
柔性数组到底如何使用呢?
首先对 0长度数组, 也叫柔性数组 做一个解释 :
用途 : 长度为0的数组的主要用途是为了满足需要变长度的结构体
用法 : 在一个结构体的最后, 申明一个长度为0的数组, 就可以使得这个结构体是可变长的. 对于编译器来说, 此时长度为0的数组并不占用空间, 因为数组名本身不占空间, 它只是一个偏移量, 数组名这个符号本身代表了一个不可修改的地址常量
C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,但结构中的柔性数组成员前面必须至少一个其他成员。柔性数组成员允许结构中包含一个大小可变的数组。sizeof 返回的这种结构大小不包括柔性数组的内存。包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。
柔性数组到底如何使用呢?看下面例子:
typedef struct st_type
{
int i;
int a[0];
}type_a;
有些编译器会报错无法编译可以改成:
typedef struct st_type
{
int i;
int a[];
}type_a;
这 样 我 们 就 可 以 定 义 一 个 可 变 长 的 结 构 体 , 用 sizeof(type_a) 得 到 的 只 有 4 , 就 是sizeof(i)=sizeof(int)。那个 0 个元素的数组没有占用空间,而后我们可以进行变长操作了。
通过如下表达式给结构体分配内存:
type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));
这样我们为结构体指针 p 分配了一块内存。用 p->item[n]就能简单地访问可变长元素。但是这时候我们再用 sizeof(*p)测试结构体的大小,发现仍然为 4。是不是很诡异?我们不是给这个数组分配了空间么?
在定义这个结构体的时候,模子的大小就已经确定不包含柔性数组的内存大小。柔性数组只是编外人员,不占结构体的编制。只是说在使用柔性数组时需要把它当作结构体的一个成员,仅此而已。再说白点,柔性数组其实与结构体没什么关系,只是“挂羊头卖狗肉”而已,算不得结构体的正式成员。
C89 不支持这种东西,C99 把它作为一种特例加入了标准。但是,C99所支持的是 incomplete type,而不是 zero array,形同 int item[0];这种形式是非法的,C99 支持的形式是形同 int item[];只不过有些编译器把 int item[0];作为非标准扩展来支持,而且在C99 发布之前已经有了这种非标准扩展了,C99 发布之后,有些编译器把两者合而为一了。
当然,上面既然用 malloc 函数分配了内存,肯定就需要用 free 函数来释放内存:
free(p);
应用场景:变长数组常用于网络通信中构造不定长数据包, 不会浪费空间浪费网络流量。
边栏推荐
- GNN,请你的网络层数再深一点~
- HDU 4912 paths on the tree (lca+)
- Four data streams of grpc
- Force buckle 575 Divide candy
- HDR image reconstruction from a single exposure using deep CNN reading notes
- MySQL数据库基本操作-DML
- anaconda安装第三方包
- Set status bar style demo
- Problems in the process of opencv300 cmake generating project
- 数据处理技巧(7):MATLAB 读取数字字符串混杂的文本文件txt中的数据
猜你喜欢
[Digital IC hand tearing code] Verilog burr free clock switching circuit | topic | principle | design | simulation
[线性代数] 1.3 n阶行列式
【10点公开课】:视频质量评价基础与实践
2500 common Chinese characters + 130 common Chinese and English characters
ZABBIX proxy server and ZABBIX SNMP monitoring
Wechat red envelope cover applet source code - background independent version - source code with evaluation points function
HDR image reconstruction from a single exposure using deep CNNs阅读札记
ResNet-RS:谷歌领衔调优ResNet,性能全面超越EfficientNet系列 | 2021 arxiv
CCNA Cisco network EIGRP protocol
第4章:再谈类的加载器
随机推荐
[Digital IC hand tearing code] Verilog burr free clock switching circuit | topic | principle | design | simulation
The SQL response is slow. What are your troubleshooting ideas?
PVL EDI project case
Powerful domestic API management tool
解决项目跨域问题
China 1,4-cyclohexanedimethanol (CHDM) industry research and investment decision-making report (2022 Edition)
OpenCV VideoCapture. Get() parameter details
[linear algebra] determinant of order 1.3 n
Mise en place d'un environnement de développement OP - tee basé sur qemuv8
HDU 4912 paths on the tree (lca+)
Report on technological progress and development prospects of solid oxide fuel cells in China (2022 Edition)
Installation and use of labelimg
Data processing skills (7): MATLAB reads the data in the text file TXT with mixed digital strings
GPS from getting started to giving up (16), satellite clock error and satellite ephemeris error
Set status bar style demo
(十八)LCD1602实验
嵌入式常用计算神器EXCEL,欢迎各位推荐技巧,以保持文档持续更新,为其他人提供便利
AI 企业多云存储架构实践 | 深势科技分享
Applet system update prompt, and force the applet to restart and use the new version
第4章:再谈类的加载器