当前位置:网站首页>Zero length array in GNU C
Zero length array in GNU C
2022-07-05 08:05:00 【Car chezi】
List of articles
What is a zero length array (Arrays of Length Zero)
If we define a zero length array in the program , You'll find that in addition to GCC compiler , In other compiling environments, it may fail to compile or have warning messages .
Let's take a very simple example :
int buffer[0];
int main(void)
{
printf("%d\n", sizeof(buffer));
return 0;
}
You'll find that , The output is 0
in other words , The length is 0 The array of does not occupy memory space .
Use of zero length arrays
however , Zero length arrays are generally not used alone , It is often used as the last member of the structure , To form a variable length structure . Let's look at an example
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
struct line {
short len;
char contents[0];
};
int main(void)
{
const char *txt = "hello";
int my_len = strlen(txt) + 1;
struct line *my_line =
(struct line *) malloc (sizeof (struct line) + my_len);
my_line->len = my_len;
memcpy(my_line->contents, txt, my_len);
printf("%s\n",my_line->contents);
printf("sizeof struct line = %lu\n", sizeof (struct line));
printf("address struct line = %p\n", my_line);
printf("address of char contents[0] = %p\n", &my_line->contents);
}
The output is :
hello
sizeof struct line = 2
address struct line = 0x8c8010
address of char contents[0] = 0x8c8012
Be careful :
- struct line Its size is 2 Bytes , Description zero length array contents It really doesn't take up space
- contents The starting address of the array is short len Behind ; The reason is that the type of array is char, If change to int , So in short len There is filling behind
- We can use structural members contents Access memory ( Code 17-18 That's ok ).contents It's like a label , Represents an address constant
- malloc Only called once ( The first 15 That's ok )
With this example , The advantage of zero length arrays is , You can give it as needed struct line
Allocate space ,
struct line *my_line = (struct line *) malloc (sizeof (struct line) + my_len);
How much do you want , Just add how much .
The difference between zero length array and pointer
Some people say , It can also be achieved with pointers . such as
struct line {
short len;
void *contents;
};
There is a difference :
- void *contents It's a variable , It takes up memory
- In use ,contents Point to another piece of memory , That is to say, it will be called again malloc
- contents Point to memory and struct line The memory occupied is usually discontinuous
therefore , The advantage of zero length array is reflected .
Define what type of zero length array
Some people think that , The zero length array at the end of the structure should be char type , The advantage is to save space , There is no need to fill in front of it . It's not , The specific type depends on the application .
such as Linux There is a structure in the kernel ——USB request block
struct urb {
struct kref kref;
void *hcpriv;
atomic_t use_count;
atomic_t reject;
int unlinked;
...
int error_count;
void *context;
usb_complete_t complete;
struct usb_iso_packet_descriptor iso_frame_desc[0];
};
11: The zero length array it uses is struct usb_iso_packet_descriptor
type , instead of char type .
Reference material
The embedded C Language self-cultivation 05: Zero length array - You know
边栏推荐
- Global and Chinese market of core pallets 2022-2028: Research Report on technology, participants, trends, market size and share
- WiFi wpa_ Detailed description of supplicant hostpad interface
- UEFI development learning 4 - getting to know variable services
- The global and Chinese market of lithographic labels 2022-2028: Research Report on technology, participants, trends, market size and share
- Global and Chinese market of quenching furnaces 2022-2028: Research Report on technology, participants, trends, market size and share
- UEFI development learning 2 - running ovmf in QEMU
- MLPerf Training v2.0 榜单发布,在同等GPU配置下百度飞桨性能世界第一
- Train your dataset with yolov4
- [trio basic from introduction to mastery tutorial XIV] trio realizes unit axis multi-color code capture
- Sql Server的存儲過程詳解
猜你喜欢
PMSM dead time compensation
Reasons for rapid wear of conductive slip rings
How to select conductive slip ring
Factors affecting the quality of slip rings in production
Connection mode - bridge and net
Cadence simulation encountered "input.scs": can not open input file change path problem
1-stm32 operation environment construction
Ten thousand words detailed eight sorting must read (code + dynamic diagram demonstration)
Train your dataset with yolov4
Shell脚本基本语法
随机推荐
[professional literacy] specific direction of analog integrated circuits
Shape template matching based on Halcon learning [v] find_ cocoa_ packages_ max_ deformation. Hdev routine
UEFI development learning 6 - creation of protocol
Shape template matching based on Halcon learning [vi] find_ mirror_ dies. Hdev routine
How to select conductive slip ring
Compilation warning solution sorting in Quartus II
Sql Server的存储过程详解
Some errors in configuring the environment
Measurement fitting based on Halcon learning [i] fuse Hdev routine
Global and Chinese market of urban rail connectors 2022-2028: Research Report on technology, participants, trends, market size and share
[trio basic tutorial 17 from getting started to mastering] set up and connect the trio motion controller and input the activation code
Explication de la procédure stockée pour SQL Server
Detailed explanation of SQL server stored procedures
Record the opening ceremony of Beijing Winter Olympics with display equipment
STM32 tutorial triple ADC interleaved sampling
Altium designer 19.1.18 - Import frame
Altium designer learning (I)
PMSM dead time compensation
L'étude a révélé que le système de service à la clientèle du commerce électronique transfrontalier a ces cinq fonctions!
Sql Server的存儲過程詳解