You copied the Doc URL to your clipboard.

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));
}
Was this page helpful? Yes No