当前位置:网站首页>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
边栏推荐
- UEFI development learning 3 - create UEFI program
- Process communication mode between different hosts -- socket
- Global and Chinese market of resistivity meter 2022-2028: Research Report on technology, participants, trends, market size and share
- Consul installation
- Halcon's practice based on shape template matching [2]
- Matlab2018b problem solving when installing embedded coder support package for stmicroelectronic
- Imx6ull bare metal development learning 2- use C language to light LED indicator
- Global and Chinese market of rammers 2022-2028: Research Report on technology, participants, trends, market size and share
- 万字详解八大排序 必读(代码+动图演示)
- Interview catalogue
猜你喜欢
Train your dataset with yolov4
Nb-iot technical summary
Interview catalogue
H264 (I) i/p/b frame gop/idr/ and other parameters
Halcon's practice based on shape template matching [1]
MLPerf Training v2.0 榜单发布,在同等GPU配置下百度飞桨性能世界第一
Factors affecting the quality of slip rings in production
Wifi-802.11 negotiation rate table
Matlab2018b problem solving when installing embedded coder support package for stmicroelectronic
Software designer: 03 database system
随机推荐
Soem EtherCAT source code analysis II (list of known configuration information)
Global and Chinese market of quenching furnaces 2022-2028: Research Report on technology, participants, trends, market size and share
My-basic application 2: my-basic installation and operation
Makefile application
Vofa+ software usage record
Imx6ull bare metal development learning 1-assembly lit LED
Some thoughts on extracting perspectives from ealfa and Ebeta
Introduction of air gap, etc
Altium designer 19.1.18 - clear information generated by measuring distance
[trio basic tutorial 18 from introduction to proficiency] trio motion controller UDP fast exchange data communication
Imx6ull bare metal development learning 2- use C language to light LED indicator
C WinForm [view status bar -- statusstrip] - Practice 2
Shell script basic syntax
matlab timeserise
Altium designer 19.1.18 - hide the fly line of a network
Drive LED -- GPIO control
Global and Chinese markets of large aperture scintillators 2022-2028: Research Report on technology, participants, trends, market size and share
Nb-iot technical summary
Global and Chinese markets for medical oxygen machines 2022-2028: Research Report on technology, participants, trends, market size and share
Development tools -- gcc compiler usage