当前位置:网站首页>Zero length array in GNU C

Zero length array in GNU C

2022-07-05 08:05:00 Car chezi

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 :

  1. struct line Its size is 2 Bytes , Description zero length array contents It really doesn't take up space
  2. 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
  3. We can use structural members contents Access memory ( Code 17-18 That's ok ).contents It's like a label , Represents an address constant
  4. 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 :

  1. void *contents It's a variable , It takes up memory
  2. In use ,contents Point to another piece of memory , That is to say, it will be called again malloc
  3. 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

原网站

版权声明
本文为[Car chezi]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202140546257757.html