当前位置:网站首页>How to use flexible arrays?
How to use flexible arrays?
2022-07-06 22:31:00 【It's Beichen not too PI acridine】
How to use flexible arrays ?
First of all, 0 Length array , Also called flexible array Make an explanation :
purpose : The length is 0 The main purpose of the array is to meet the need for variable length structures
usage : At the end of a structure , Declare a length of 0 Array of , You can make the structure variable in length . For compilers , In this case, the length is 0 The array of does not take up space , Because the array name itself doesn't take up space , It's just an offset , The array name itself represents an immutable address constant
C99 in , The last element in the structure is allowed to be an array of unknown size , This is called a flexible array member , But a flexible array member in a structure must be preceded by at least one other member . Flexible array members allow structures to contain an array of variable size .sizeof The size of the structure returned does not include the memory of the flexible array . Structures that contain flexible array members use malloc () Function to dynamically allocate memory , And the allocated memory should be larger than the size of the structure , To fit the expected size of the flexible array .
How to use flexible arrays ? Here's an example :
typedef struct st_type
{
int i;
int a[0];
}type_a;
Some compilers will report errors and cannot compile. They can be changed to :
typedef struct st_type
{
int i;
int a[];
}type_a;
this sample I People Just can With set The righteous One individual can change Long Of junction structure body , use sizeof(type_a) have to To Of only Yes 4 , Just yes sizeof(i)=sizeof(int). that 0 An array of elements doesn't take up space , Then we can do the lengthening operation .
Allocate memory to the structure through the following expression :
type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));
So we give the structure pointer p Allocated a block of memory . use p->item[n] You can simply access variable length elements . But then we use sizeof(*p) Test the size of the structure , It's still found that 4. Isn't it weird ? We allocated space to this array ?
When defining this structure , The size of the module has determined the memory size that does not contain flexible arrays . Flexible arrays are just non staff , It does not occupy the compilation of the structure . Just say that when using a flexible array, you need to treat it as a member of the structure , That's it . And white points , Flexible arrays have nothing to do with structures , It's just “ Selling dog meat with sheep's head ” nothing more , Not a full member of the structure .
C89 I don't support this kind of thing ,C99 Add it to the standard as a special case . however ,C99 What is supported is that incomplete type, instead of zero array, It's the same int item[0]; This form is illegal ,C99 The form of support is in the form of int item[]; It's just that some compilers put int item[0]; As a non-standard extension to support , And in C99 There was this nonstandard extension before the release ,C99 After the release , Some compilers combine the two .
Of course , Since the top is used malloc Function allocates memory , Definitely need to use free Function to free memory :
free(p);
Application scenarios : Variable length arrays are often used in network communication to construct indefinite length packets , Don't waste space, waste network traffic .
边栏推荐
- Crawler obtains real estate data
- [leetcode daily clock in] 1020 Number of enclaves
- Daily question 1: force deduction: 225: realize stack with queue
- ThreadLocal详解
- Spatial domain and frequency domain image compression of images
- NPDP certification | how do product managers communicate across functions / teams?
- OpenNMS分离数据库
- 【数字IC手撕代码】Verilog无毛刺时钟切换电路|题目|原理|设计|仿真
- Gd32f4xx serial port receive interrupt and idle interrupt configuration
- labelimg的安装与使用
猜你喜欢

Chapter 3: detailed explanation of class loading process (class life cycle)

CCNA Cisco network EIGRP protocol

Unity3d minigame unity webgl transform plug-in converts wechat games to use dlopen, you need to use embedded 's problem
Learn the principle of database kernel from Oracle log parsing

每日一题:力扣:225:用队列实现栈

AdaViT——自适应选择计算结构的动态网络

uniapp滑动到一定的高度后固定某个元素到顶部效果demo(整理)

That's why you can't understand recursion

Netxpert xg2 helps you solve the problem of "Cabling installation and maintenance"

手写ABA遇到的坑
随机推荐
雅思口语的具体步骤和时间安排是什么样的?
volatile关键字
二分图判定
extern关键字
Export MySQL table data in pure mode
【编译原理】做了一半的LR(0)分析器
Chapter 3: detailed explanation of class loading process (class life cycle)
(十八)LCD1602实验
Sword finger offer question brushing record 1
RESNET rs: Google takes the lead in tuning RESNET, and its performance comprehensively surpasses efficientnet series | 2021 arXiv
rust知识思维导图xmind
Clip +json parsing converts the sound in the video into text
软考高级(信息系统项目管理师)高频考点:项目质量管理
uniapp设置背景图效果demo(整理)
CocosCreator+TypeScripts自己写一个对象池
2022-07-05 stonedb sub query processing parsing time analysis
手写ABA遇到的坑
Is there any requirement for the value after the case keyword?
MySQL教程的天花板,收藏好,慢慢看
云原生技术--- 容器知识点