当前位置:网站首页>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 .
边栏推荐
- 网络基础入门理解
- 剑指offer刷题记录1
- OpenCV VideoCapture. Get() parameter details
- 【无标题】
- MySQL ---- first acquaintance with MySQL
- pytorch_ Yolox pruning [with code]
- 空结构体多大?
- 12、 Start process
- Senior soft test (Information System Project Manager) high frequency test site: project quality management
- 硬件開發筆記(十): 硬件開發基本流程,制作一個USB轉RS232的模塊(九):創建CH340G/MAX232封裝庫sop-16並關聯原理圖元器件
猜你喜欢
HDR image reconstruction from a single exposure using deep CNN reading notes
树的先序中序后序遍历
MySQL ---- first acquaintance with MySQL
新手程序员该不该背代码?
UE4蓝图学习篇(四)--流程控制ForLoop和WhileLoop
ResNet-RS:谷歌领衔调优ResNet,性能全面超越EfficientNet系列 | 2021 arxiv
Learn the principle of database kernel from Oracle log parsing
2022-07-04 the high-performance database engine stonedb of MySQL is compiled and run in centos7.9
NetXpert XG2帮您解决“布线安装与维护”难题
在IPv6中 链路本地地址的优势
随机推荐
The ceiling of MySQL tutorial. Collect it and take your time
SQL server generates auto increment sequence number
新手程序员该不该背代码?
Aardio - 通过变量名将变量值整合到一串文本中
Memorabilia of domestic database in June 2022 - ink Sky Wheel
自定义 swap 函数
CCNA Cisco network EIGRP protocol
pytorch_ Yolox pruning [with code]
const关键字
【LeetCode】19、 删除链表的倒数第 N 个结点
0 basic learning C language - digital tube
Leetcode exercise - Sword finger offer 26 Substructure of tree
Spatial domain and frequency domain image compression of images
在IPv6中 链路本地地址的优势
枚举与#define 宏的区别
Assembly and Interface Technology Experiment 6 - ADDA conversion experiment, AD acquisition system in interrupt mode
2022-07-05 use TPCC to conduct sub query test on stonedb
ThreadLocal详解
机试刷题1
(十八)LCD1602实验