当前位置:网站首页>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
边栏推荐
- 如何进行导电滑环选型
- Measurement fitting based on Halcon learning [i] fuse Hdev routine
- Global and Chinese markets for recycled boilers 2022-2028: Research Report on technology, participants, trends, market size and share
- Live555 RTSP audio and video streaming summary (II) modify RTSP server streaming URL address
- 研究发现,跨境电商客服系统都有这五点功能!
- Mlperf training v2.0 list released, with the same GPU configuration, the performance of Baidu PaddlePaddle ranks first in the world
- My-basic application 1: introduction to my-basic parser
- C, Numerical Recipes in C, solution of linear algebraic equations, LU decomposition source program
- Imx6ull bare metal development learning 1-assembly lit LED
- Global and Chinese markets of large aperture scintillators 2022-2028: Research Report on technology, participants, trends, market size and share
猜你喜欢
UEFI development learning 6 - creation of protocol
Win10 shortcut key
The research found that the cross-border e-commerce customer service system has these five functions!
Measurement fitting based on Halcon learning [i] fuse Hdev routine
Ten thousand words detailed eight sorting must read (code + dynamic diagram demonstration)
My-basic application 2: my-basic installation and operation
Consul安装
【云原生 | 从零开始学Kubernetes】三、Kubernetes集群管理工具kubectl
Shape template matching based on Halcon learning [v] find_ cocoa_ packages_ max_ deformation. Hdev routine
找不到实时聊天软件?给你推荐电商企业都在用的!
随机推荐
Markdown tips
Correlation based template matching based on Halcon learning [II] find_ ncc_ model_ defocused_ precision. hdev
Programming knowledge -- basis of C language
H264 (I) i/p/b frame gop/idr/ and other parameters
万字详解八大排序 必读(代码+动图演示)
The browser cannot access Baidu
Measurement fitting based on Halcon learning [III] PM_ measure_ board. Hdev routine
Bootloader implementation of PIC MCU
Global and Chinese market of core pallets 2022-2028: Research Report on technology, participants, trends, market size and share
[trio basic tutorial 16 from introduction to proficiency] UDP communication test supplement
MLPerf Training v2.0 榜单发布,在同等GPU配置下百度飞桨性能世界第一
如何进行导电滑环选型
Live555 push RTSP audio and video stream summary (I) cross compilation
IEEE access personal contribution experience record
【云原生 | 从零开始学Kubernetes】三、Kubernetes集群管理工具kubectl
Wifi-802.11 negotiation rate table
Sql Server的存储过程详解
[trio basic from introduction to mastery tutorial XIV] trio realizes unit axis multi-color code capture
UEFI development learning series
Record the torch encountered by win10 cuda. is_ False problem in available()