Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the need of empty braces '{ }' at the end of array of structs?

I hit some c code in Linux kernel:

static struct ctl_table ip_ct_sysctl_table[] = {     {         .procname   = "ip_conntrack_max",         .maxlen     = sizeof(int),         .mode       = 0644,         .proc_handler   = proc_dointvec,     },     // ...     {         .procname   = "ip_conntrack_log_invalid",         .maxlen     = sizeof(unsigned int),         .mode       = 0644,         .proc_handler   = proc_dointvec_minmax,         .extra1     = &log_invalid_proto_min,         .extra2     = &log_invalid_proto_max,     },     { } }; 

Here an array of structs ends with { }. For what purpose was it added?
By the way, a bit above this code there is another array of structs, but without empty braces at the end.

When should I use empty braces at the end of an array of structs?

like image 262
NK-cell Avatar asked Mar 02 '20 13:03

NK-cell


2 Answers

This particular change was part of the sysctl net: Remove unused binary sysctl code commit by Eric W. Biederman, changing the initialization of the last element of the ip_ct_sysctl_table array from {0} to {} (and performs similar changes to many other array initializations).

The {0} pattern seems to have been around for much longer though, and both {0} or {} final element-initialization is commonly (in the Linux source code) explicitly referred to as Terminating entry, so it is likely a pattern present to allow consuming these arrays without knowing their lengths, terminating consumption when hitting the zero-initialized terminating entry. E.g. for the similar arrays in sound/aoa/fabrics/snd-aoa-fabric-layout.c the intent of the zero-initialization is even explicitly mentioned in a comment, e.g.:

static struct codec_connection toonie_connections[] = {   {       .connected = CC_SPEAKERS | CC_HEADPHONE,       .codec_bit = 0,   },   {} /* terminate array by .connected == 0 */ }; 
like image 69
dfrib Avatar answered Sep 22 '22 17:09

dfrib


You're probably familiar with zero-terminated strings. ctl_table ip_ct_sysctl_table[] is a zero-terminated array, i.e. the last array entry has all-zero members.

like image 36
MSalters Avatar answered Sep 20 '22 17:09

MSalters