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?
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 */ };
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With