# Deﬁnition/Initialisation of Compound Literals

0 like 0 dislike
174 views
Deﬁnition/Initialisation of Compound Literals

### For Indian Students- INR 360/- || For International Students- \$9.99/-

S.No.

Course Name

Coupon

1.

Tensorflow 2 & Keras:Deep Learning & Artificial Intelligence

Apply Coupon

2.

Natural Language Processing-NLP with Deep Learning in Python Apply Coupon

3.

Computer Vision OpenCV Python | YOLO| Deep Learning in Colab Apply Coupon

0 like 0 dislike
by Goeduhub's Expert (8.3k points)

A compound literal is an unnamed object which is created in the scope where is deﬁned. The concept was ﬁrst introduced in C99 standard. An example for compound literal is

Examples from C standard, C11-§6.5.2.5/9:

int *p = (int ){ 2, 4 };

p is initialized to the address of the ﬁrst element of an unnamed array of two ints.

The compound literal is an lvalue. The storage duration of the unnamed object is either static (if the literal appears at ﬁle scope) or automatic (if the literal appears at block scope), and in the latter case the object's lifetime ends when control leaves the enclosing block.

void f(void)

{

int *p;

/*...*/

p = (int ){ *p };

/*...*/

}

p is assigned the address of the ﬁrst element of an array of two ints, the ﬁrst having the value previously pointed to by p and the second, zero.[...]

Here p remains valid until the end of the block.

Compound literal with designators

(also from C11)

struct point

{

unsigned x;

unsigned y;

};

extern void drawline(struct point, struct point);

// used somewhere like this

drawline((struct point){.x=1, .y=1}, (struct point){.x=3, .y=4});

A ﬁctive function drawline receives two arguments of type struct point. The ﬁrst has coordinate values x == 1 and y == 1, whereas the second has x == 3 and y == 4

Compound literal without specifying array length

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

In this case the size of the array is no speciﬁed then it will be determined by the length of the initializer.

Compound literal having length of initializer less than array size speciﬁed

int *p = (int ){1, 2, 3};

rest of the elements of compound literal will be initialized to 0 implicitly.

Note that a compound literal is an lvalue and therefore it's elements can be modiﬁable. A read-only compound literal can be speciﬁed using const qualiﬁer as (const int[]){1,2}.

Compound literal containing arbitrary expressions

Inside a function, a compound literal, as for any initialization since C99, can have arbitrary expressions.

void foo()

{

int *p;

int i = 2;

j = 5;

/*...*/

p = (int ){ i+j, i*j };

/*...*/

}