Also for external declarations:<p><pre><code>   &#x2F;* file scope *&#x2F;
   int a[];

   &#x2F;* later in same translation unit, or in another one: *&#x2F;

   int a[42];
</code></pre>
In this case, we get an &quot;incomplete array type&quot; after the first declaration. The storage size isn&#x27;t known and so sizeof a cannot be computed.<p>This is also a <i>de facto</i> kind of &quot;flexible array&quot;, but not formally named such.<p>For instance we can do this:<p><pre><code>   &#x2F;* In proprietary kernel source code *&#x2F;
   &#x2F;* Size deliberately unspecified *&#x2F;
   extern struct driver driver_table[]; 
</code></pre>
The proprietary kernel code is compiled into .o files and linked into a .a archive library.<p>To complete the build, a driver table module must be added and some drivers. The module which defines driver_table can be open-source. It defines the size of driver_table by how many entries there actually are; users can configure as many or few drivers and re-build the kernel, without having to recompile the proprietary part in the .a archive.<p>Unixes were shipped like this once upon a time. The &quot;device major number&quot; is just the position in the device table.