carraysgccinitializationvariable-length

Initializing a dynamically-sized Variable-Length Array (VLA) to 0


The following line of code, which creates a variable-length array on the stack:

char name[length] = {'\0'};

Generates the following compiler diagnostics:

error: variable-sized object may not be initialized
warning: excess elements in array initializer
warning: (near initialization for ‘name’)

What options are available to me for initializing VLAs? Am I forced to use a line such as:

memset(name, 0, sizeof(name));

Instead?


Solution

  • Yes, you must write code for the initialisation of VLAs (which could be a memset() like you have described, or any other way that you care to).

    It is simply a constraint in the C standard (§6.7.8):

    1. The type of the entity to be initialized shall be an array of unknown size or an object type that is not a variable length array type.

    The above was correct as written in 2010. As of C23, VLAs can now be initialised with an empty initialiser { }, which as with other compound types will initialise each element and sub-element recursively to zero of the appropriate type.