当前位置:网站首页>柔性数组到底如何使用呢?
柔性数组到底如何使用呢?
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);
应用场景:变长数组常用于网络通信中构造不定长数据包, 不会浪费空间浪费网络流量。
边栏推荐
- Notes de développement du matériel (10): flux de base du développement du matériel, fabrication d'un module USB à RS232 (9): création de la Bibliothèque d'emballage ch340g / max232 SOP - 16 et Associa
- OpenCV VideoCapture. Get() parameter details
- Management background --5, sub classification
- 自制J-Flash烧录工具——Qt调用jlinkARM.dll方式
- 第3章:类的加载过程(类的生命周期)详解
- Daily question 1: force deduction: 225: realize stack with queue
- Data processing skills (7): MATLAB reads the data in the text file TXT with mixed digital strings
- CCNA Cisco network EIGRP protocol
- 中国VOCs催化剂行业研究与投资战略报告(2022版)
- 十二、启动流程
猜你喜欢
Aardio - 封装库时批量处理属性与回调函数的方法
Leetcode question brushing (XI) -- sequential questions brushing 51 to 55
Search element topic (DFS)
HDR image reconstruction from a single exposure using deep CNN reading notes
3DMAX assign face map
Xiaoman network model & http1-http2 & browser cache
CCNA Cisco network EIGRP protocol
0 basic learning C language - interrupt
2022-07-04 mysql的高性能数据库引擎stonedb在centos7.9编译及运行
Oracle control file and log file management
随机推荐
剪映+json解析将视频中的声音转换成文本
【数字IC手撕代码】Verilog无毛刺时钟切换电路|题目|原理|设计|仿真
Shortcut keys in the terminal
[Digital IC hand tearing code] Verilog burr free clock switching circuit | topic | principle | design | simulation
GD32F4XX串口接收中断和闲时中断配置
lora同步字设置
anaconda安装第三方包
The SQL response is slow. What are your troubleshooting ideas?
GPS from getting started to giving up (12), Doppler constant speed
Adjustable DC power supply based on LM317
Insert sort and Hill sort
3DMax指定面贴图
NPDP认证|产品经理如何跨职能/跨团队沟通?
做接口测试都测什么?有哪些通用测试点?
BarcodeX(ActiveX打印控件) v5.3.0.80 免费版使用
[sciter bug] multi line hiding
A Mexican airliner bound for the United States was struck by lightning after taking off and then returned safely
GPS from getting started to giving up (19), precise ephemeris (SP3 format)
GPS from getting started to giving up (XX), antenna offset
0 basic learning C language - digital tube