5.62 Compound literals in C99

ISO C99 supports compound literals. A compound literal looks like a cast followed by an initializer.

Its value is an object of the type specified in the cast, containing the elements specified in the initializer. It is an lvalue.

For example:

int *y = (int []) {1, 2, 3}; 
int *z = (int [3]) {1};

Note:

int *y = (int []) {1, 2, 3}; is accepted by the compiler, but int y[] = (int []) {1, 2, 3}; is not accepted as a high-level (global) initialization.

In the following example source code, the compound literals are:

  • (struct T) { 43, "world"}

  • &(struct T) {.b = "hello", .a = 47}

  • &(struct T) {43, "hello"}

  • (int[]){1, 2, 3}

struct T
{
   int a;
   char *b;
} t2;
void g(const struct T *t);
void f()
{
   int x[10];
   ...
   t2 = (struct T) {43, "world"};
   g(&(struct T) {.b = "hello", .a = 47});
   g(&(struct T) {43, "bye"});
   memcpy(x, (int[]){1, 2, 3}, 3 * sizeof(int));
}
Non-ConfidentialPDF file icon PDF versionARM DUI0472M
Copyright © 2010-2016 ARM Limited or its affiliates. All rights reserved.